为了避免出现菱形问题,用使用虚拟继承后的子类大问题?
铭毅天下 大数据领域优质创作者 博客专家认证 2012-08-29 07:42:38 为了避免出现菱形问题,用使用虚拟继承后的子类大小。示例如下:
class baseClass
{
public:
virtual void fool(void) {}
int nValue;
char c;
};
class midClass1 : virtual public baseClass
{
public:
virtual void setVal(){}
int nMidValue1;
};
class midClass2 : virtual public baseClass
{
public:
virtual void setVal(){}
int nMidValue2;
};
class derivedClass : public midClass1, public midClass2
{
public:
virtual void foo2(){}
int subVal;
};
int main()
{
cout << sizeof(baseClass) << endl; //12
cout << sizeof(midClass1) << endl; //24
cout << sizeof(midClass2) << endl; //24
cout << sizeof(derivedClass) << endl; //48
return 0;
}
已经知道的,对于baseClass类的大小,考虑地址对齐为4(c)+4(nvalue)+4(虚拟函数指针)共12个字节;
如果去掉虚拟继承,为如下形式:
class midClass1 : public baseClass //仅是增加了nMidValue1,扩展为16字节
class midClass2 : public baseClass //仅是增加了nMidValue2,扩展为16字节
class derivedClass : public midClass1, public midClass2 // 在继承midclass1,midclass2基础上仅是增加了subVal,为16+16+4=36字节。
不理解点:为什么加了虚拟继承,sizeof(midClass1) = 24;sizeof(midClass2)=24;sizeof(derivedClass)48;
如何解读?
主要原因,VisualC++添加了了虚拟基类表指针来实现虚拟继承,因此,空间变大?但感觉应该增加4个字节的指针值,实际怎么多了8个字节?不解中。。。。。。。