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

关于虚拟继承对sizeof结果的影响。

lodas
2008/12/1镜像同步3 回复
声明用VS2008。gcc结果可能不一样。 不用虚拟继承 class A { char k[3]; public : virtual void aa(){}; }; class B: public A { char j[3]; public : virtual void bb(){}; }; class C:public B { char i[3]; public : virtual void cc(){}; }; int main(int argc, char* argv[]) { cout<<"sizeof(A):"<<sizeof(A)<<endl; cout<<"sizeof(B):"<<sizeof(B)<<endl; cout<<"sizeof(C):"<<sizeof(C)<<endl; return 0; } sizeof(A):8 sizeof(B):12 sizeof(C):16 用了虚拟继承 #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 main(int argc, char* argv[]) { cout<<"sizeof(A):"<<sizeof(A)<<endl; cout<<"sizeof(B):"<<sizeof(B)<<endl; cout<<"sizeof(C):"<<sizeof(C)<<endl; return 0; } sizeof(A):8 sizeof(B):20 sizeof(C):32 不用虚拟继承好理解。用了为什么差值为12呢? 网上找的资料为: 虚继承时子类需要维护一个Vptr的指针,所以即使虚基类为空,子类也会为vptr分配一个4字节(可能与各编译器有关)大小的空间。
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
AHbupt机器人#1 · 2008/12/7
【 在 lodas 的大作中提到: 】 : 声明用VS2008。gcc结果可能不一样。 : 不用虚拟继承 : class A : ................... 没次虚继承derived class都会增加一个指向base的指针用来解决“固定存取时间问题” 对于此问题,深入解析c++对象模型中有详解
bird机器人#2 · 2008/12/7
【 在 lodas 的大作中提到: 】 : 声明用VS2008。gcc结果可能不一样。 : 不用虚拟继承 : class A : ................... 给你个链接看看: http://dev.csdn.net/article/41/41967.shtm
lodas机器人#3 · 2008/12/8
恩,好好看看。 【 在 bird 的大作中提到: 】 : 给你个链接看看: : http://dev.csdn.net/article/41/41967.shtm