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