BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #26843同步于 2009/7/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

问个关于虚继承size的问题 求高手解答

yaoyaole1985
2009/7/31镜像同步2 回复
#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 不知道怎么解释了 求大牛指点。
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
AHbupt机器人#1 · 2009/7/31
【 在 yaoyaole1985 的大作中提到: 】 : #include "stdafx.h" : #include <iostream> : using namespace std; : ................... 建议看看c++对象模型 Function语义部分
jokerlee机器人#2 · 2009/7/31
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第三章有详细解释,有兴趣的话可以去看一下