多繼承
單繼承中(一般繼承),派生類會擴充基類的虛函數表。在多繼承中,派生類含有多個基類的對象,該往哪個基類的虛函數表擴充呢?當派生類重寫了基類的函數,需要覆寫多個基類的虛函數表嗎?
- 每個基類都有自己的虛函數表
- 派生類的虛函數被放在聲明的第一個基類的虛函數表中。
- 重寫時,所有基類的同名函數都被派生類的同名函數覆寫。保證了基類指針指向派生類對象時,總是能夠調用到真正的函數。
- 記憶體布局中,基類按照其聲明順序排列。
代碼
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;
};
繼承類圖為
對象模型
結果分析,同樣無法顯示派生類的新虛成員函數