多继承和菱形继承
菱形继承和菱形虚拟继承
多继承(慎重使用)
一个子类有两个或以上直接父类时称这个继承关系为多继承
由多继承导致的菱形继承
对象模型
数据冗余:数据冗余是指基类成员的多个副本包含在派生类中的情况,从而造成的内存资源浪费。
- 解决方案
- 虚继承
- 解决方案
二义性:由于继承时可能有多个同名成员,而在访问时不知道要访问哪一个。
- 解决方案:
- 虚继承
- 指定基类
- 解决方案:
虚继承
虚继承的对象模型
具体对象
d
存放的位置是由编译器来决定的。额外记录了相对于
A
的偏移量(途中为十六进制)。为什么要记录一个指针,指向额外空间用来记录偏移量,而不在所属的对象内直接保存呢?
- 目的是为了可以处理更多的冲突变量,便于添加变量。
这个记录偏移量的表,就叫虚基表。
A
中保存的是d对象记录的_a
值。
菱形虚拟继承
对于菱形虚拟继承来说,如果想要在B,C中对A的虚函数进行重写,如果仅仅在B,C中虚函数重写是不行的——编译报错。
分析原因对象模型::
如果仅仅对B,C
重写,此时编译器不知道要将B,C
中哪一个重写的虚函数保存到共享的A
中。
想要解决以上问题,只能让B,C,D
同时对A
的虚函数进行重写,并且最后,对于一个D
对象而言,保存共享的是 A
的虚函数表——并且其中存放的是D的虚函数重写
,并且如果D
想要继续添加自己的虚函数,也不会额外创建虚表,而是直接添加到A
的虚表中。
菱形虚拟继承更复杂的情况
B,C不仅仅重写了A的虚函数,并且B,C还有自己单独的虚函数。
运用
总结:取到偏移量,再计算地址,再去访问。
多继承和菱形继承
https://weihehe.top/2024/07/05/多继承/