虛函數
調用虛函數時函數行為將根據對象所屬類的不同而變化。
父類指針或引用指向子類對象時,可訪問子類重寫方法( virtual函數)但無法訪問在父類中沒有定義的子類方法和數據成員。
#include <iostream>using namespace std;class Super { public:Super(){}virtual void where(){cout<<"there is Super"<<endl;} };class Sub :public Super { public:Sub(){}virtual void where(){cout<<"there is Sub"<<endl;}void what(){cout<<"what?";} };int main() {Sub sub;Super* ptr = ⊂Super &ref = sub;sub.where();ptr->where();ref.where();return 0; }
運行結果:
?
通過ptr和ref訪問的where()均為子類方法,無法訪問子類的what()方法。
?
所有析構函數都應該聲明為虛函數(至少祖先類的析構函數應聲明為virtual)
一個函數被聲明為virtual即使在它子類中沒有顯式的指出該函數依然是virtual。
如果父類的析構函數沒有聲明為virtual,當delete一個實際指向子類對象的父類指針時,析構函數調用鏈將被破壞。
#include <iostream>using namespace std;class Something { public:Something(){cout <<"1";}~Something(){cout<<"1";} };class Super : public Something { public:Super(){cout<<"2";}~Super(){cout<<"2";} };class Sub :public Super { public:Sub(){cout<<"3";}~Sub(){cout<<"3";} };int main() {Super* ptr = new Sub;delete ptr;return 0; }
運行結果:
將Something的析構函數聲明為virtual后,結果就為“123321”了。
?
?