虚拟继承和虚表

普通继承和虚拟继承类的大小变化:

普通继承:                                                                                                      虚拟继承:

类A和类B大小为:

                                                                 

由此可见:1、类中静态成员不会影响类的大小;

                           2、当虚拟继承时,子类中需要有一个虚基类表来记录虚继承关系,所以此时子类需要多一个虚基类表指针;而且只需要                         一个即可。

多重继承+非虚拟继承:                                                                       多重继承+虚拟继承:


各类的大小为: 

                                                         

由此可见:1、在多重继承+非虚拟继承下基类A的的实体会在D类中存在两份 ;

                  2、在多重继承+虚拟继承下基类A的的实体会在D类中只存在一份 ;

                  3、至于类B和类C的大小为何是5在上面已介绍;

                  4、至于类D的大小由以下几点确定:

                        1、被类B,C,D共享的唯一一个ClassA,大小为1字节 ;

                        2、类B大小(5)-1+ 类C大小(5) -1 ,大小为8字节 ;

                                3、类D本身的大小,大小为0字节;


普通继承和虚拟继承类的虚表变化:

普通继承:                                                                                                  虚拟继承:

                         

   普通继承虚表结果:  


   虚拟继承虚表结果:  


由此可见:当普通继承时,子类只有一个虚表,即从父类继承而来的虚表;当虚拟继承时子类除了从父类继承而来的虚表,还会有                     一个自己的虚表,即有两个虚表。












  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值