天天看點

虛繼承記憶體分析

虛繼承主要是為了解決菱形繼承的問題。針對多繼承的二義性本文不加分析,本文主要針對虛拟繼承的記憶體進行分析。

首先看源碼:

#include<iostream>
usingnamespace::std;
classA
{
public:
         intdataA;
};
classB: virtualpublicA
{
public:
         intdataB;
};
classC: virtualpublicA
{
public:
         intdataC;
};
classD: publicB,publicC
{
public:
         intdataD;
};
int_tmain(intargc,_TCHAR* argv[])
{
         cout<< "sizeof(A) = "<< sizeof(A)<< endl;
         cout<< "sizeof(B) = "<< sizeof(B)<< endl;
         cout<< "sizeof(C) = "<< sizeof(C)<< endl;
         cout<< "sizeof(D) = "<< sizeof(D)<< endl;
         system("pause");
         return0;
}      

運作結果如下:

虛繼承記憶體分析

使用vs指令行,将A、B、C、D四個類的記憶體分布圖列印出來如下:

虛繼承記憶體分析

A類的記憶體布局中,在類中偏移量為0的位置,存儲成員變量dataA。

虛繼承記憶體分析

在B類的記憶體布局中,首先存儲的是一個vbptr,然後存儲的是資料成員dataB,然後是存儲的基類A的部分。在vbptr指向的位址存儲的是偏移量8,即偏移8為基類的位址。

虛繼承記憶體分析

C類的布局同B一緻。

虛繼承記憶體分析

在D類中,首先存儲的是繼承自B類的部分,然後是繼承自C類的部分,然後是D類自身的成員dataA,最後是基類A的部分。在圖中,B類和C類都有一個vbptr,該vbptr分别指向到基類位址的偏移量。

繼續閱讀