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

2021-06-18 09:57:33 字數 758 閱讀 5169

好了,我們從最基礎的的討論起。當c++支援virtual base class 時,就會多了一些額外負擔,當class 中內含乙個或多個virtual base class subobject時,將分成兩個部分,乙個不變區域性和乙個共享區域性。最初的方案是為每乙個虛基類安插乙個指標指向這個虛基類,其缺點是為了負擔太重,而且當虛繼承鏈加長時,導致間接訪問時間加長(需通過多次跳轉)。因此有兩種解決方案(《深入探索c++物件模型》一書中所提):

一、是引入virtual base class table,不管多少個虛基類,總是只有乙個指標指向它,這個virtual base class table(vbtbl)包括真正的 virtual base class 指標。

二、bjarne的辦法是在virtual function table中放置virtual base class的offset,而非位址,這個offset在virtual function table 的負位置(正值是索引virtual function,而負值則方向盤引到virtual base class offsets)。

我用visual stuidion 2010觀測到的實際情況是。在類中增加乙個指標(vbptr)指向乙個vbtbl,這個vbtbl的第一項記載的是從vbptr 與本類的偏移位址,如果本類有虛函式,那麼第一項是ff ff ff fc(也就是-4),如果沒有則是零,第二項起是vbptr與本類的虛基類的偏移值。vc2010的這種方案個人覺得沒有bjarne的好,一是要多乙個指標,二是因為vbptr與虛函式表分開設計,也不便於修改。

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

鑽石型虛擬繼承 虛繼承是為了解決多繼承中的資料冗餘而出現的。列印虛函式表 void printfmove int vbptr 列印偏移量 cout void test int main 程式執行結果 物件在記憶體中的布局 所以,有以下結論 在虛繼承時,類中會自動加乙個指標 vbptr 該變數指向乙個...

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

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

C 物件記憶體布局之繼承

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