先定義四個類,它們的繼承關係為:
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 切換書籤開關 ...