直接繼承和虛繼承的記憶體布局

2021-08-07 11:28:10 字數 813 閱讀 1525

子類物件的記憶體布局:虛表指標、父類成員變數、子類成員變數

虛函式表的布局:父類的虛函式位址(按宣告順序)、子類自定義的虛函式的位址(按宣告順序)

子類物件的記憶體布局:虛表指標、父類成員變數、子類成員變數

虛函式表的布局:子類已覆蓋的虛函式的位址、父類中未被覆蓋的虛函式的位址、子類自定義的虛函式的位址

子類物件的記憶體布局:父類1的虛表指標、父類1的成員變數、父類2的虛表指標、父類2的成員變數

父類1虛函式表的布局:父類1的虛函式位址、子類自定義的虛函式的位址

子類物件的記憶體布局:父類1的虛表指標、父類1的成員變數、父類2的虛表指標、父類2的成員變數

父類1虛函式表的布局:子類已覆蓋的虛函式的位址、父類中未被覆蓋的虛函式的位址、子類自定義的虛函式的位址

父類2虛函式表的布局:子類已覆蓋的虛函式的位址、父類中未被覆蓋的虛函式的位址

直接繼承的多繼承中,繼承了幾個父類,就要維護幾個虛函式表,並且為他們分配指標。

直接繼承的多繼承中,子類的自定義虛函式總是放在第乙個父類的虛函式表的末尾。

直接繼承的多繼承中,如果發生菱形繼承,那麼子類物件的記憶體布局中不會做優化,比如說a派生b、c,d再多繼承b、c,那麼d類的物件會儲存兩個a類成員變數的副本。

但是虛繼承的多繼承中,如果發生菱形繼承,那麼

b物件的記憶體布局為:父類a的虛表指標、b自己的成員變數、父類a的成員變數

c物件的記憶體布局為:父類a的虛表指標、c自己的成員變數、父類a的成員變數

d物件的記憶體布局為:父類b的虛表指標、父類b的成員變數、

父類c的虛表指標、父類c的成員變數、d自己的成員變數、祖父類a的成員變數。

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

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

虛繼承之單繼承的記憶體布局

c 2.0以後全面支援虛函式與虛繼承,這兩個特性的引入為c 增強了不少功能,也引入了不少煩惱。虛函式與虛繼承有哪些特性,今天就不記錄了,如果能搞了解一下編譯器是如何實現虛函式和虛繼承,它們在類的記憶體空間中又是如何布局的,卻可以對c 的了解深入不少。這段時間花了一些時間了解這些玩意,搞得偶都,不過總...

虛繼承之單繼承的記憶體布局

c 2.0以後全面支援虛函式與虛繼承,這兩個特性的引入為c 增強了不少功能,也引入了不少煩惱。虛函式與虛繼承有哪些特性,今天就不記錄了,如果能搞了解一下編譯器是如何實現虛函式和虛繼承,它們在類的記憶體空間中又是如何布局的,卻可以對c 的了解深入不少。這段時間花了一些時間了解這些玩意,搞得偶都 先看一...