目录:
本篇涉及内容:
- 多继承
- 菱形继承
- 虚继承
C++中的多继承:
1)基本语法:class SubClass : public SuperClass1, public SuperClass2
2)多继承可能出现的问题:
- 当父类与父类之间出现成员同名的情况
此时访问这些父类间的同名成员需要加上父类作用域用于区分是来自哪个父类的成员
菱形继承:
1)基本概念
有两个子类同时继承了同一个父类,然后又有一个类多继承了这两个子类
2)菱形继承可能会出现数据杂冗问题
比如动物都有sex这个属性
所以羊和驼这两个类都继承了这个属性
当羊驼类多继承羊和驼这两个类时,则会重复继承分别来自羊类和驼类的sex属性
羊驼类中要两份这样的数据没有有意义
这样在羊驼类中就出现了数据杂冗的问题
如何解决菱形继承中出现的数据杂冗问题?
- 利用虚继承
-
什么是虚继承?
在继承方式前加上关键字
virtual
即可,此时Animal类称为虚基类 -
虚继承的底层原理
每一个继承了虚基类的子类中都会有:
vbptr——虚基类表指针(virtual base table pointer)占用4个字节
vbtable——虚基类表(virtual table)不占用内存
子类中的虚基类表指针指向了虚基类表
虚基类表中记录了虚基类与本类的偏移地址
通过这个偏移地址就可以找到虚基类中的成员
这样一来羊类和驼类就共同维护同一份虚基类的成员数据
同样虚基类表指针也会继承给下一个子类需要注意的是:虚基类中的成员依旧会继承到子类中,但是其所有子类还有间接子类(Animal和SheepTuo),都只会存在其一份成员数据,下面我们用代码来验证.
这里的SheepTuo类的大小为12字节,其继承过来了Sheep类和Tuo类的虚基类表指针,和一份Animal类中的age成员变量,虚继承解决了之前普通继承出现的数据杂冗的情况.
-
- 有关虚继承和虚基类更详细的介绍:
介绍了有关虚基类的构造
详细介绍了其底层原理