C++語言的多態性有兩種類型:靜態多態性和動態多態性。函數重載和運算符重載就是靜態多態性的具體表現,而動態多態性是指程序運行過程中才動態的確定操作所針對的對象,它是通過虛函數實現的;
1,虛函數的概念:
一個指向基類的指針可用來指向從基類派生的任何對象,這樣就可以達到一個接口多個實現的訪問了;虛函數是在基類中被冠以virtual的成員函數,它提供了一種接口界面。虛函數可以在一個或者多個派生類中被重新定義,但要求在派生類中從新定義時,虛函數的函數原型,包括返回值,函數名,參數名,參數個數,參數類型的順序必須完全相同;
2,晚期匹配是怎麼發生的???
所有的工作由編譯器在幕後完成。為了完成這件事,編譯器對每個包含虛函數的類創建一個表成為VTABLE。在VTABLE中,編譯器放置特定類的虛函數地址。在每個帶有虛函數的類中,編譯器秘密的置一指針,成為VPTR指向這個對象的VTABLE。通過基類指針做虛函數調用時,編譯器靜態的插入取得這個VPTR,並在VTABLE表中查找函數地址的代碼。
3,虛特性:
用虛函數實現運行時多態性德關鍵之處是:必須使用指向基類的指針或引用訪問虛函數。
注意:
在派生類中重新定義基類的虛函數是函數重載的另一種特殊形式,它不屬於一般的函數重載。當重載一般函數時,僅要求函數名相同,但重載一個虛函數時,要求函數名,返回類型,參數個數,參數類型,參數順序完全相同,否則會導致虛特性丟失;
#include運行結果:using namespace std; class figure { public: void set(double i=0,double j=0) { x=i; y=j; } virtual void show_area() { cout<<"No area computation defined for this class"< set(10,5); f->show_area(); f=&s; f->set(10,5); f->show_area(); f=&c; f->set(10); f->show_area(); return 0; }
Triangle with high 10 and base 5 has an area of 25
Square with dimension 10*5 has an area of 50
Circle with radius 10 has an area of 314