C 中的多型

2021-06-25 08:03:47 字數 1480 閱讀 4218

c++中的多型分為靜多型和動多型(也就是靜態繫結和動態繫結兩種現象),靜動的區別主要在於這種繫結發生在編譯期還是執行期,發生在編譯期的是靜態繫結,也就是靜多型;發生在執行期的則是動態繫結,也就是動多型。

一:靜多型可以通過模板和函式過載來實現,下面舉兩個例子:

1)函式模板

template t max(const t& lsh, const t& rhs)

返回兩個任意型別物件的最大值(物件),前提是該型別能夠使用》運算子進行比較,並且返回值是bool型別。

使用:int a = 3; int b = 4;

cout << max(a, b) << endl;

float c = 2.4; float d = 1.2;

cout << max(c, d) << endl;

輸出結果為:

42.4

這種繫結發生在編譯期,這是由於模板的例項化是發生在編譯期的,即在編譯時編譯器發現你呼叫max(a, b)時就自動生成乙個函式

int max(const int& lsh, const int& rhs)

即將所有的t替換成int;

當你呼叫max(c, d)時就自動生成乙個函式

float max(const float& lsh, const float& rhs)

之所以說開始的函式定義是函式模板,就是因為他就像個模子似的,你可以用鋁作為原料也可以用石膏或者銅。

2)函式過載:

int max (int a, int b)

int max (int a, int b, int c)

兩個函式名稱一樣,引數型別或個數不完全相同,返回值一樣(這個不重要)。

使用:int a = 3, b = 4, c = 5;

cout << max(a, b) << endl;

cout << max(a, b, c) << endl;

輸出結果為:45

確定函式的過程也發生在編譯器,當你使用max(a, b),編譯器發現只有兩個引數,那麼就呼叫只有兩個引數的函式版本,當使用max(a, b, c)時,編譯器則使用有3個引數的版本。

二:動多型則是通過虛函式(virtual)來實現。

class a

}class b : public a

}使用:

a a* = b();

a->func();

輸出: b::func()

編譯期是不呼叫任何函式的,編譯器編譯到a->func()時只是檢查有沒有語法問題,經過檢查沒有。編譯器並不知道呼叫的是a版本的func()還是b版本的func(),由於a是乙個指向b物件的指標,所以a只知道它指向的是乙個a型別(或者能轉換成a型別)的物件。通常整合體系就說明了(由於是公有繼承)b是一種a。在執行期,a要呼叫a所指向物件的func()函式,就對它指向的物件下達呼叫func()的命令,結果a所指向的是乙個b物件,這個物件就呼叫了自己版本(b版)的func()函式,所以輸出時b::func()

C 中的多型

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

C 中的多型

定義 同樣的訊息被不同型別的物件接收時產生不同的行為。原理 1.編譯時多型 靜態繫結 2.執行時多型 動態繫結 分類 1.過載 包括函式過載,運算子過載 靜態繫結 2.覆蓋 包括子類和父類間虛函式 虛析構函式和純虛函式 動態繫結 要求 1.函式名相同 2.引數不同 栗子 include using ...

C 中的多型

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