C++基類物件指向子類物件的現象
阿新 • • 發佈:2019-02-08
#include<iostream> using namespace std; class A { public: void fun() { cout<<"AA fun;"<<endl; } }; class B: public A { public: void fun() { cout<<"BB fun;"<<endl; } }; class C: public B { public: void fun() { cout<<"CC fun;"<<endl; } }; void main() { A *a; B b; C c; a = &b; a->fun(); a = &c; a->fun(); }
觀察以上程式碼,也許好多人會認為程式碼的運作結果為:
BB fun;
CC fun;
其實不然,當我們真正的編譯執行這段程式碼後,我們會發現運作結果是:
AA fun;
AA fun;
為什麼會出現這種情況呢?
因為在C++中,無論基類的物件指向何方,由於他們的原始型別沒有變化,當我們用基類物件呼叫同名的函式時,基類物件只能找到基類的成員函式的地址,因而只能呼叫基類的成員函式。
那如果我們希望得到:
BB fun;
CC fun;
的結果,怎麼辦呢?
方法很簡單,,在基類的成員函式名前加virtual關鍵字,這就能把普通成員函式成為虛擬函式。因為此時的呼叫就不會在編譯時候確定而是在執行時確定。不在單獨考慮指標/引用的型別而是看指標/引用的物件的型別來判斷函式的呼叫,根據物件中虛指標指向的虛表中的函式的地址來確定呼叫哪個函式。