C 虛繼承中的物件記憶體布局

2021-07-12 04:37:59 字數 1352 閱讀 3414

鑽石型虛擬繼承

虛繼承是為了解決多繼承中的資料冗餘而出現的。

//列印虛函式表

}void printfmove(int* vbptr)

//列印偏移量

cout <

}void test()

int main()

程式執行結果:

物件在記憶體中的布局:

所以,有以下結論:

在虛繼承時,類中會自動加乙個指標(vbptr),該變數指向乙個全類共享的偏移量表,如果本類有虛函式,那麼第一項記錄著當前子物件相對與虛基類表指標(vbptr指標)的偏移,是ff ff ff fc(也就是-4),如果沒有則是零;第二項起是被繼承的基類(上述例子為base類)子物件相對於vbptr指標的偏移量。

c 虛繼承物件的記憶體布局

好了,我們從最基礎的的討論起。當c 支援virtual base class 時,就會多了一些額外負擔,當class 中內含乙個或多個virtual base class subobject時,將分成兩個部分,乙個不變區域性和乙個共享區域性。最初的方案是為每乙個虛基類安插乙個指標指向這個虛基類,其缺...

虛繼承及繼承的記憶體布局

1.為什麼需要虛繼承 如下圖所示如果訪問der fun or der m nvalue就會帶來二義性,無法確定是呼叫base1的還是base2的,所以為了解決多重繼承情況下成員訪問的二義性,引入了虛繼承機制。一般繼承 虛繼承 2.虛繼承實現 在虛繼承下,der通過共享虛基類superbase來避免二...

C 物件記憶體布局之繼承

感謝在部落格寫作過程中韓朋程和羅國佳的寶貴意見!繼承,是c 語言程式設計中重要的組成部分。c 物件模型,簡單的理解可以說就是c 中乙個物件的記憶體布局。下面就總結一下類繼承對c 物件的記憶體布局產生的影響。首先,請記住如下規則 以下規則針對的都是vc編譯器 1 對於一般的類繼承。如果基類和派生類都具...