1. 程式人生 > >C++基類物件指向子類物件的現象

C++基類物件指向子類物件的現象

#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關鍵字,這就能把普通成員函式成為虛擬函式。因為此時的呼叫就不會在編譯時候確定而是在執行時確定。不在單獨考慮指標/引用的型別而是看指標/引用的物件的型別來判斷函式的呼叫,根據物件中虛指標指向的虛表中的函式的地址來確定呼叫哪個函式。