C 中的多型

2021-07-04 07:32:27 字數 2042 閱讀 1444

定義:同樣的訊息被不同型別的物件接收時產生不同的行為。

原理:1.編譯時多型(靜態繫結)

2.執行時多型(動態繫結)

分類:1.過載:包括函式過載,運算子過載 (靜態繫結)

2.覆蓋:包括子類和父類間虛函式、虛析構函式和純虛函式 (動態繫結)

要求:1.函式名相同;2.引數不同

栗子:

#include using namespace std;

int add(int a, int b)

int add(double a, double b)

//報錯:

//錯誤 2 error c2556: 「double add(int,int)」: 過載函式與「int add(int,int)」只是在返回型別上不同

//錯誤 3 error c2371: 「add」: 重定義;不同的基型別

//錯誤 4 error c2264: 「add」: 函式定義或宣告中有錯誤;未呼叫函式

要求:必須是虛函式的繼承

有virtual:多型,呼叫函式只取決於引數指標所指向的位址,與指標沒有關係(操作型別根據位址型別動態繫結)

沒有virtual:不是多型,呼叫函式只取決於引數指標型別,與指向的位址無關注:子類中與基類虛函式對應的函式可以不宣告為虛函式,系統會自動判斷子類中該函式是否為虛函式,判斷標準為:

a.該函式是否與基類的虛函式有相同的名稱

b.該函式是否與基類的虛函式有相同的引數個數及相同的對應引數型別

c.該函式是否與基類的虛函式有相同的返回值,或者滿足賦值相容規則的指標、引用型的返回值。

三條同時滿足則判斷為虛函式

栗子:

#include using namespace std;

作用:基類的析構函式應定義為虛函式,否則,當用基類的指標呼叫子類的物件時呼叫的是基類的虛構函式,而子類中基類沒有的部分沒有被析構,造成記憶體洩露。

栗子:

#include using namespace std;

用base* 呼叫的derived類在析構的時候產生了記憶體洩露。如果將base的析構函式改為虛函式,即

作用:帶有純虛函式的類是抽象類,抽象類和純虛函式都不能實現,只提供藉口實現多型(抽象類不能例項化,但是可以做指標)

栗子:

#include using namespace std;

C 中的多型

封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...

C 中的多型

c 中的多型分為靜多型和動多型 也就是靜態繫結和動態繫結兩種現象 靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型 發生在執行期的則是動態繫結,也就是動多型。一 靜多型可以通過模板和函式過載來實現,下面舉兩個例子 1 函式模板 template t max c...

C 中的多型

一 首先理解一下什麼叫多型 同一種操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。舉乙個形象的例子,在我們聽 會的時候,當指揮發出開始的訊號,不同的樂器收到相同的訊號,但是他們產生不同的行為 鋼琴發出的是鋼琴的聲音,小號發出的是小號的聲響。或者,如果把每個動物當成乙個物件,...