天天看点

虚继承内存分析

虚继承主要是为了解决菱形继承的问题。针对多继承的二义性本文不加分析,本文主要针对虚拟继承的内存进行分析。

首先看源码:

#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分别指向到基类地址的偏移量。