C++继承机制(三)——多继承、菱形继承、虚继承原理

目录:
本篇涉及内容:
  • 多继承
  • 菱形继承
  • 虚继承
C++中的多继承:

1)基本语法:class SubClass : public SuperClass1, public SuperClass2

2)多继承可能出现的问题:

  • 当父类与父类之间出现成员同名的情况

    此时访问这些父类间的同名成员需要加上父类作用域用于区分是来自哪个父类的成员
菱形继承:

1)基本概念

有两个子类同时继承了同一个父类,然后又有一个类多继承了这两个子类

2)菱形继承可能会出现数据杂冗问题

比如动物都有sex这个属性
所以羊和驼这两个类都继承了这个属性
当羊驼类多继承羊和驼这两个类时,则会重复继承分别来自羊类和驼类的sex属性
羊驼类中要两份这样的数据没有有意义
这样在羊驼类中就出现了数据杂冗的问题

如何解决菱形继承中出现的数据杂冗问题?

  • 利用虚继承
    1. 什么是虚继承?
      在这里插入图片描述

      在继承方式前加上关键字virtual即可,此时Animal类称为虚基类

    2. 虚继承的底层原理
      在这里插入图片描述

      每一个继承了虚基类的子类中都会有:
      vbptr——虚基类表指针(virtual base table pointer)占用4个字节
      vbtable——虚基类表(virtual table)不占用内存
      子类中的虚基类表指针指向了虚基类表
      虚基类表中记录了虚基类与本类的偏移地址
      通过这个偏移地址就可以找到虚基类中的成员
      这样一来羊类和驼类就共同维护同一份虚基类的成员数据
      同样虚基类表指针也会继承给下一个子类

      需要注意的是:虚基类中的成员依旧会继承到子类中,但是其所有子类还有间接子类(Animal和SheepTuo),都只会存在其一份成员数据,下面我们用代码来验证.
      在这里插入图片描述
      这里的SheepTuo类的大小为12字节,其继承过来了Sheep类和Tuo类的虚基类表指针,和一份Animal类中的age成员变量,虚继承解决了之前普通继承出现的数据杂冗的情况.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值