研究了一下virtual继承,多继承这个东西的确乱

还是用最简单的多继承来看,猜猜输出会是什么:

  1. class A{
  2. public:
  3.     int n;
  4.     void f(){cout<<"A.f"<<endl;}
  5. };
  6. class B: virtual public A{
  7. public:
  8.     char bn;
  9.     B(){cout<<"C"<<endl;}
  10. };
  11. class C: virtual public A{
  12. public:
  13.     int cn;
  14.     C(){cout<<"C"<<endl;}
  15. };
  16. class D: public B,public C{
  17. public:
  18.     double dn;
  19. };
  20. int _tmain(int argc, _TCHAR* argv[])
  21. {
  22.     //E cy;cy.f();
  23.     cout<<sizeof(A)<<endl;
  24.     cout<<sizeof(B)<<endl;
  25.     cout<<sizeof(C)<<endl;
  26.     cout<<sizeof(D)<<endl;
  27.     system("Pause");
  28.     return 0;
  29. }

我在VS2005下运行结果是:

4

12

12

28

后来用g++运行了一下,结果一样。

笼统的原理书上都有,就不说了,这里继承结果大致是这样的,最后D中的确只有A的一份拷贝了,但是附带的东西全都加进来了...

由于增加了虚继承指针和新的成员变量,B、C因为字节对齐的原因相对A都是总共多了8,D中包含了每个父类B、C的虚继承指针(大小:4+(8+8)+8=28)... 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值