多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。
在c++中有兩種多型性:
◆1、定義格式
虛函式是乙個類的成員函式,定義格式如下:
virtual 返回型別 函式名(參數列);
說明:
◆2、通過虛函式實現多型性
虛函式怎樣實現多型性?請參見下面2個例子。
①【例8.6】計算學分。可由本科生類派生出研究生類,但它們各自的從課程學時數折算為學分數的演算法是不同的,本科生是16個學時一學分,而研究生是20個學時一學分。賦值相容規則與自定義的複製建構函式。(檢視原始碼)
執行結果為:
本科生:物理 80學時 5學分
研究生:物理 80學時 4學分
本科生:數學 160學時 10學分
研究生:數學 160學時 8學分
分析:第一行,學分是由student類的成員函式calculate()計算。
第二行,學分是由gradestudent重新定義的calculate()計算,它遮蔽了基類的同名函式。與不定義為虛函式一樣,屬編譯時的多型性。
第三行,用的是指向student類的物件s的指標,用的是student類的calculate()。
第四行,指標型別是指向基類的指標,但這裡指標指向了派生類gradestudent的物件g,按賦值相容規則是准許的,但只能用基類的成員,可實際上用了派生類中新定義的calculate()。這就是虛函式體現的多型性。如果不是虛函式,第四行輸出是10學分。如果不使用基類指標指向派生類gradestudent的物件g,也不能實現執行時的多型性。
②為體現虛函式的多型性的優點,可改造【例8.6】為【例8.7】計算學分(派生類定義不再重複)
void calfun(student &ps,string str,int hour)
int main()
執行結果為:
本科生:物理 80學時 5學分
研究生:物理 80學時 4學分
分析:這裡沒有用指標,而用了student的引用,正如在第四章中所敘述的對編譯器而言引用的處理同樣是通過位址間接完成的,所以引用也可以實現執行時的多型性。加了乙個calfun()函式,使用更為方便。
◆ 3、注意事項
乙個類中將所有的成員函式盡可能地設定為虛函式總是有好處的,但必須注意以下幾條:
C 多型性與虛函式
物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...
C 多型性 與 虛函式
1.運算子過載 運算子過載形式 1 過載為類的成員函式 運算子過載函式說明為類的成員函式的格式為 類名 operator 運算子 參數列 如 c1 c2 編譯器將給出的解釋為 c1.operator c2 該運算子過載函式僅僅有乙個引數,所以過載為成員函式時,雙目運算子僅有乙個引數。對於單目運算子,...
C 多型性與虛函式
2 多型是物件導向的重要技術之一,它是一種行為的封裝,是同乙個事物所表現出來的多種形態,簡單地說就是 乙個介面 多種形態。3 在執行時使用同乙個成員名來呼叫類物件的成員函式,會呼叫哪個物件的成員函式呢?這就是多型要解決的問題!1 多型技術允許將基類指標或基類引用指向派生類物件。2 把不同派生類的物件...