多继承和菱形继承

菱形继承和菱形虚拟继承

多继承(慎重使用)

一个子类有两个或以上直接父类时称这个继承关系为多继承

由多继承导致的菱形继承

菱形继承

对象模型

菱形继承的对象模型

  • 数据冗余:数据冗余是指基类成员的多个副本包含在派生类中的情况,从而造成的内存资源浪费。

    • 解决方案
      • 虚继承
  • 二义性:由于继承时可能有多个同名成员,而在访问时不知道要访问哪一个。

    • 解决方案
      • 虚继承
      • 指定基类

指定基类解决二义性

虚继承

怎么添加virtual

虚继承的对象模型

多继承

  • 具体对象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/多继承/
作者
weihehe
发布于
2024年7月5日
许可协议