C 物件模型(中)多繼承

2021-08-19 16:33:39 字數 2652 閱讀 3269

例如下面**:

class b

virtual void func_2()//虛函式

//protected:

int _b;

};class c

virtual void func_3()//虛函式

//protected:

int _c;

};class d :public b ,public c

virtual void func_4()//derive 類自己的虛函式

void func_5()//普通成員函式

因為d繼承了兩個父類,所以d類中是有兩張虛表,而且d物件獨有的虛函式也放在第一張虛表中,這裡因為d物件先繼承了b物件,所以從物件模型來看,b物件在d物件的上面部分,並且b的虛表中還要存放d物件獨有的虛函式,當d對func_1()進行了重寫,b和c虛表中的func_1()都會被覆蓋。

class a

virtual void func_2()//獨有的虛函式

//protected:

int _a;

};class b :public a

virtual void func_3()//虛函式

virtual void func_4()//虛函式

//protected:

int _b;

};class c :public a

virtual void func_5()//虛函式

virtual void func_6()//虛函式

//protected:

int _c;

};class d :public b ,public c

virtual void func_3()//重寫了b的虛函式

virtual void func_5()//重寫了c的虛函式

virtual void func_7()//獨有的虛函式

因為是菱形繼承,這裡的b和c物件中都會分別有乙個a物件,當然d中自己的虛函式也是放在第乙個繼承的父類的虛表中的,這裡就是放在b物件中的a物件中的虛表中。

class a

virtual void func_2()//獨有的虛函式

//protected:

int _a;

};class b :virtual public a

virtual void func_3()//虛函式

virtual void func_4()//虛函式

//protected:

int _b;

};class c :virtual public a

virtual void func_5()//虛函式

virtual void func_6()//虛函式

//protected:

int _c;

};class d :public b, public c

virtual void func_3()//重寫了b的虛函式

virtual void func_5()//重寫了c的虛函式

virtual void func_7()//獨有的虛函式

從上面的模型來看,d類中有三張虛表,一張是a的,裡面放的是b和c繼承了a了虛函式,一張是放b自己的虛函式和d中獨有的虛函式(因為d是先繼承了b),一張是放c自己的虛函式。

當然如果b沒有自己的虛函式,並且d類也沒有自己獨有的虛函式,那麼這裡就不會為b開闢塊空間放b的虛函式表,同理,如果c類中沒有自己獨有的虛函式,那麼也就不會為c開闢一塊空間放c的虛函式表。

C 物件模型 單繼承,多繼承,虛繼承

有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...

C 物件模型 單繼承,多繼承,虛繼承

有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...

C 物件模型5 多繼承下的物件模型

從單繼承可以知道,派生類中只是擴充了基類的虛函式表。如果是多繼承的話,又是如何擴充的?1 每個基類都有自己的虛表。2 子類的成員函式被放到了第乙個基類的表中。3 記憶體布局中,其父類布局依次按宣告順序排列。4 每個基類的虛表中的 print 函式都被 overwrite 成了子類的 print 這樣...