多重繼承的物件模型

2021-04-13 21:58:19 字數 824 閱讀 6424

廢話少說,在c++中是允許多重繼承的,比如有乙個派生類cimp派生自cbasea,和cbaseb。在cimp中覆蓋了兩個基類中的虛函式。如果乙個函式要求基類的指標,而我們傳遞乙個派生類物件的位址,編譯器如何保證這是安全的。

在c++中,類是編譯期的,為了實現多重繼承,在派生類的記憶體布局中保留了基類的完整資訊塊,這樣當發生派生類到基類的轉換的時候,只需要改變指標位置就可以了。

如下**:

class cbasea

class cbaseb

;有乙個派生類:

class cimp :

public cbasea,

public cbaseb 

;在記憶體中:

-----------------------------

cbasea虛函式表指標

m_i------------------

cbaseb虛函式表指標

m_i----------------

m_i------------------------------

唯一奇怪的就是派生類怎末沒有自己的虛函式表指標哪?其實對於派生類的虛函式完全可以加到某乙個基類的虛函式表中,而編譯器有足夠的資訊產生正確的呼叫。

當然,由於c++給了編譯器如此多的自由,所以不同的編譯器可能產生不同的記憶體結構,但是差別不會太大,以上的記憶體布局就是在vc6.0下的結構。

哈哈,美麗的c++.

寫的一些測試**:

#include

using namespace std;

class a;

int main()

通過此**對虛函式機制有了更深刻的了解。

Cpp 物件模型探索 多重繼承虛函式表分析

include class base1 virtual void func12 virtual void func13 virtual void func14 class base2 virtual void func22 virtual void func23 class son public b...

多重繼承 C 中的多重繼承

多重繼承是c 的一項功能,其中乙個類可以從多個類繼承。繼承類的建構函式以它們繼承的相同順序被呼叫。例如,在以下程式中,在a的建構函式之前呼叫b的建構函式。include using namespace std class a class b class c public b,public a not...

繼承中的物件模型

1 在子類物件構造時,需要呼叫父類建構函式對其繼承得來的成員進行初始化 2 在子類物件析構時,需要呼叫父類析構函式對其繼承得來的成員進行清理 繼承中的構造析構呼叫原則 建構函式執行順序 1 先執行父類的建構函式 2 再執行子類的建構函式 析構函式執行順序 1 先執行子類析構函式 2 再執行父類析構函...