VS2008中虛繼承記憶體布局分析

2021-05-25 02:03:02 字數 761 閱讀 1968

先定義四個類,它們的繼承關係為:

class base;

class a:virtual public base;

class b:virtual public base;

class c:public a,public b 

用這四個類進行分析

class base

void get();

class a :virtual public base

;class b:virtual public base

;class c:public a,public b 

;//測試**

int _tmain(int argc, _tchar* argv)

執行結果:

base:1245024 

a:1245000

b:1245008

c:1245000

a offset:24

b offset:16

4290668 b

4291264 c

d e

a

結果分析:

1、對於虛繼承,定義乙個派生類物件,則虛基類的資料成員儲存在最末尾,起始部分儲存著乙個指標+派生類自己的資料成員,指標指向乙個值,這個值就表示著基類的偏移

2、如果乙個類即有虛繼承又有非虛繼承,則記憶體的布局情況為:

非虛基類

派生類虛基類

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

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

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

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

VS2008中快捷方式

ctrl m crtr o摺疊所有大綱 ctrl m crtr p 停止大綱顯示 ctrl k crtr c 注釋選定內容 ctrl k crtr u 取消選定注釋內容 ctrl j 列出成員 智慧型感知shift alt enter 切換全屏編輯 ctrl b,t ctrl k,k 切換書籤開關 ...