c++是支援多繼承的,那麼多繼承關係中派生類物件模型和單繼承關係中有什麼不一樣呢?我們來看一看。
首先給出乙個多繼承關係:
class base1
int b1;
};class base2
int b2;
};class derive :public base1, public base2
int d;
};
類base1有乙個資料成員b1,在其建構函式中被初始化為1;類base2有乙個資料成員b2,在其建構函式中被初始化為2;類derive繼承自類base1與類base2(都是public繼承),並且新增資料成員d,並初始化為3。我們在主函式中宣告乙個派生類物件,觀察其記憶體資料:
與單繼承關係一樣,繼承自基類的資料成員放在低位址空間,而派生類新增資料成員則放在高位址空間。那麼繼承自不同基類的資料成員的存放位置是隨機存放還是按一定順序存放的呢?在這裡我們可以看到這裡繼承自兩個基類的資料成員是按照繼承關係宣告的順序存放的,是否所有多繼承關係中都是這樣的呢?
現在我們將繼承關係宣告中基類順序交換一下:
class derive :public base2, public base1
int d;
};
如果來自基類資料的存放順序與繼承關係宣告順序有關的話,現在派生類記憶體中的資料存放應該是:213。結果如何:
可以看到,隨著繼承關係宣告中基類順序的改變,派生類中繼承自基類的資料成員存放順序也發生了變化。
我們可以畫出多繼承關係中派生類的物件模型:
分析結束,望高手斧正。
派生類物件模型之菱形繼承派生類物件模型
當繼承關係超過兩重後,就不可避免地出現菱形繼承的問題,什麼是菱形繼承呢?我們來看乙個圖 像這樣,類b1 b2繼承自類a,而類c又與類b1 b2是多繼承的關係,整個繼承關係呈菱形,這就是菱形繼承。那麼菱形繼承存在什麼問題呢?先給出這樣乙個繼承關係 class a int a class base1 p...
C 派生類物件模型
include using namespace std class base virtual base int get const private int num class base1 virtual base1 private int helthy class base2 virtual bas...
繼承和派生類
一 基本概念 繼承是物件導向的程式設計的重要特色之一,它可以有效提高軟體的重用性。若在已有類a的基礎上建立了乙個新類b,則稱類b繼承了類a,類a稱為基類或父類,類b稱為派生類或子類。c 中,繼承又分單一繼承和多重繼承。若派生類只有乙個基類,則稱為單一繼承 若派生類的基類多於乙個,則稱為多重繼承。1 ...