返回信息流#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
char k[3];
public:
virtual void aa(){};
};
class B:public virtual A
{
char j[3];
public:
virtual void bb(){};
};
class C:public virtual B
{
char i[3];
public:
virtual void cc(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"sizeof(A)"<<sizeof(A)<<endl;
cout<<"sizeof(B)"<<sizeof(B)<<endl;
cout<<"sizeof(C)"<<sizeof(C)<<endl;
return 0;
}
这里输出8,20,32可以解释;
去掉继承时的virtual即class B:public A,class C:public B
输出8,12,16 不知道怎么解释了 求大牛指点。
这是一条镜像帖。来源:北邮人论坛 / cpp / #26843同步于 2009/7/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
问个关于虚继承size的问题 求高手解答
yaoyaole1985
2009/7/31镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
【 在 yaoyaole1985 的大作中提到: 】
: #include "stdafx.h"
: #include <iostream>
: using namespace std;
: ...................
建议看看c++对象模型 Function语义部分
8 12 16很好解释, 相反 8 20 32 解释起来就费劲了
公有继承的情况下
class A : 3 + 4(vptr) + 1(对齐) = 8
calss B : 8(class A) + 3 + 1(对齐) = 12
calss C : 12(class B) + 3 + 1(对齐) = 16
虚拟继承的情况下
class A :3 + 4(vptr) + 1(对齐) = 8
class B :8(class A) + 4(vptr_B) + 4(offset of A)+ 3 + 1(对齐) = 20
class C :20(class A) + 4(vptr_C) + 4(offset of B)+ 3 + 1(对齐) = 32
虚拟继承比较繁琐,应用价值不大,一般只用在多重继承里,而多重继承基本上很少用,所以钻这个没啥必要,搞清楚公有继承就行了。Inside The C++ Object Model第三章有详细解释,有兴趣的话可以去看一下