廢話少說,在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 再執行父類析構函...