8 6 多型性與虛函式

2021-07-13 11:29:03 字數 1199 閱讀 7503

多型性

是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。

在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、注意事項

乙個類中將所有的成員函式盡可能地設定為虛函式總是有好處的,但必須注意以下幾條:

虛函式與多型性

實驗內容 定義基類base,其資料成員為高h,定義成員函式disp 為虛函式,由基類派生出長方體類和圓柱類,並在兩個派生類中定義成員函式disp 為虛函式。在主函式中,用基類base定義指標p,用指標p動態呼叫虛函式disp 顯示面積。虛函式 它是基類中的成員函式,並在派生類中被過載。派生類中的虛函...

多型性與虛函式

1.函式過載 overloading 與靜態聯編 static binding 函式過載 overloading 指的是,允許多個不同函式使用同乙個函式名,但要求這些同名函式具有不同的參數列。參數列中的引數個數不同 參數列中對應的引數型別不同 參數列中不同型別引數的次序不同。例 intabs int...

虛函式與多型性

include stdafx.h include using namespace std class animal void sleep void breathe class fish public animal void fn animal pan int tmain int argc,tchar...