繼承關係下類的記憶體布局

2021-10-04 01:42:09 字數 789 閱讀 4571

參考:

針對牛客網按知識分類中c++題第158個

1.每乙個 class 產生出一堆指向 virtual functions 的指標,放在**之中,這個**被稱為 virtual table(vtbl)。

2,。每乙個 class object 被新增了乙個指標,指向相關的 virtual table 。通常這個指標被稱為 vptr,在32位系統中佔4個位元組。64位佔8個位元組。vptr 的設定(setting)和重置(resetting)都由每乙個 class 的constructor、destructor 和 copy assignment 運算子自動完成,每乙個 class 所關聯的 type_info object (用以支援 runtime type identigication,rtti)也經由 virtual table 被指出來,通常是放在**的第乙個 slot 處。

從以上資訊,我的認識時,乙個 class 如果有 virtual function,那麼它就會把自己的 virtual function 資訊」上交「給 virtual table(vtbl)。如果其他 class 比如 class a 繼承它,或者拷貝構造它,那麼這個 virtual table 就會被share,a 就會得到該 virtual table 的 vptr,並且如果 a 自己有virtual function,也會產生新的 virtual function 指標放入 vptr 所指的virtual table 之中。然後這個 virtual table 會放在class a 的位址的首部。

C 類繼承記憶體布局

c 類繼承記憶體布局 c 繼承分為兩種,普通繼承和虛擬繼承 virtual 具體的繼承又根據父類中的函式是否virtual而不同。下面就單繼承分為幾種情況闡述 1.普通繼承 父類無virtual函式 若子類沒有新定義virtual函式 此時子類的布局是 由低位址 高位址 為父類的元素 沒有vptr ...

C 繼承記憶體布局 虛繼承下的多繼承情況

前面介紹了單繼承以及正常多繼承的記憶體分布情況,最後介紹一種虛繼承的情況。同時虛繼承也是解決多繼承二義性的一種手段。首先將 改動如下,base1跟base11是完全一樣的 除了繼承的時候base1是虛繼承,我們先看下單繼承的時候,虛繼承的記憶體分布跟非虛繼承有什麼區別。可以看到虛繼承的記憶體分布要複...

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

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