多型性是物件導向程式設計的關鍵技術之一。利用多型性技術,可以呼叫同乙個函式名的函式,實現完全不同的功能。若程式語言不支援多型性,不能稱為物件導向的語言。
在c++中有兩種多型性:
◆1、定義格式
虛函式是乙個類的成員函式,定義格式如下:
virtual 返回型別 函式名(參數列);
說明:◆2、通過虛函式實現多型性
虛函式怎樣實現多型性?請參見下面2個例子。
①【例8.6】計算學分。可由本科生類派生出研究生類,但它們各自的從課程學時數折算為學分數的演算法是不同的,本科生是16個學時一學分,而研究生是20個學時一學分。賦值相容規則與自定義的複製建構函式。
#include#includeusing
namespace
std;
class
student
virtual
void calculate()
void setcourse(string str,int
hour)
int gethour()
void setcredit(int cred)
void print()
};class gradestudent:public
student;
void calculate()
};int
main()
執行結果為:
本科生:物理 80學時 5學分
研究生:物理 80學時 4學分
本科生:數學 160學時 10學分
研究生:數學 160學時 8學分
分析:第一行,學分是由student類的成員函式calculate()計算。
第二行,學分是由gradestudent重新定義的calculate()計算,它遮蔽了基類的同名函式。與不定義為虛函式一樣,屬編譯時的多型性。
第三行,用的是指向student類的物件s的指標,用的是student類的calculate()。
第四行,指標型別是指向基類的指標,但這裡指標指向了派生類gradestudent的物件g,按賦值相容規則是准許的,但只能用基類的成員,可實際上用了派生類中新定義的calculate()。這就是虛函式體現的多型性。如果不是虛函式,第四行輸出是10學分。如果不使用基類指標指向派生類gradestudent的物件g,也不能實現執行時的多型性。
②為體現虛函式的多型性的優點,可改造【例8.6】為
#include#includeusing
namespace
std;
class
student
virtual
void calculate()
void setcourse(string str,int
hour)
int gethour()
void setcredit(int cred)
void print()
};class gradestudent:public
student;
void calculate()
};void calfun(student &ps,string str,int
hour)
intmain()
執行結果為:
本科生:物理 80學時 5學分
研究生:物理 80學時 4學分
分析:這裡沒有用指標,而用了student的引用,正如在第四章中所敘述的對編譯器而言引用的處理同樣是通過位址間接完成的,所以引用也可以實現執行時的多型性。加了乙個calfun()函式,使用更為方便。
◆ 3、注意事項
乙個類中將所有的成員函式盡可能地設定為虛函式總是有好處的,但必須注意以下幾條:
C 之多型性與虛函式
物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...
C 之多型性與虛函式
物件導向程式設計中的多型性是指向不同的物件傳送同乙個訊息,不同物件對應同一訊息產生不同行為。在程式中訊息就是呼叫函式,不同的行為就是指不同的實現方法,即執行不同的函式體。也可以這樣說就是實現了 乙個介面,多種方法 從實現的角度來講,多型可以分為兩類 編譯時的多型性和執行時的多型性。前者是通過靜態聯編...
虛函式與多型性
實驗內容 定義基類base,其資料成員為高h,定義成員函式disp 為虛函式,由基類派生出長方體類和圓柱類,並在兩個派生類中定義成員函式disp 為虛函式。在主函式中,用基類base定義指標p,用指標p動態呼叫虛函式disp 顯示面積。虛函式 它是基類中的成員函式,並在派生類中被過載。派生類中的虛函...