天天看點

c++對象模型03:多重繼承記憶體布局

多繼承

單繼承中(一般繼承),派生類會擴充基類的虛函數表。在多繼承中,派生類含有多個基類的對象,該往哪個基類的虛函數表擴充呢?當派生類重寫了基類的函數,需要覆寫多個基類的虛函數表嗎?

  • 每個基類都有自己的虛函數表
  • 派生類的虛函數被放在聲明的第一個基類的虛函數表中。
  • 重寫時,所有基類的同名函數都被派生類的同名函數覆寫。保證了基類指針指向派生類對象時,總是能夠調用到真正的函數。
  • 記憶體布局中,基類按照其聲明順序排列。

代碼

class Base
{
public:
 
    Base(int i) :baseI(i){};
    virtual ~Base(){}
 
    int getI(){ return baseI; }
 
    static void countI(){};
 
    virtual void print(void){ cout << "Base::print()"; }
 
private:
 
    int baseI;
 
    static int baseS;
};
class Base_2
{
public:
    Base_2(int i) :base2I(i){};

    virtual ~Base_2(){}

    int getI(){ return base2I; }

    static void countI(){};

    virtual void print(void){ cout << "Base_2::print()"; }
 
private:
 
    int base2I;
 
    static int base2S;
};
 
class Drive_multyBase :public Base, public Base_2
{
public:

    Drive_multyBase(int d) :Base(1000), Base_2(2000) ,Drive_multyBaseI(d){};
 
    virtual void print(void){ cout << "Drive_multyBase::print" ; }
 
    virtual void Drive_print(){ cout << "Drive_multyBase::Drive_print" ; }
 
private:
    int Drive_multyBaseI;
};
           

繼承類圖為

c++對象模型03:多重繼承記憶體布局

對象模型

c++對象模型03:多重繼承記憶體布局

結果分析,同樣無法顯示派生類的新虛成員函數

c++對象模型03:多重繼承記憶體布局
c++對象模型03:多重繼承記憶體布局

繼續閱讀