当前位置: 首页 > article >正文

C++中虚继承为什么可以解决菱形继承的数据冗余问题

        在C++中菱形继承会有数据冗余的问题发生,我们可以使用虚继承来解决,那虚继承的原理是什么,为什么它可以解决这个问题。

菱形继承的数据冗余问题

class A {
public:
    int data;
};

class B : public A {};

class C : public A {};

class D : public B, public C {};

        在上述代码中,类 D 的对象在内存中会包含两份来自类 A 的成员变量 data(一份通过 B 继承而来,另一份通过 C 继承而来),这就导致了资源冗余的问题,并且在访问 data 成员时可能会产生二义性(因为不清楚具体要访问哪一份 data)

虚继承

class A {
public:
    int data;
};

class B : virtual public A {};

class C : virtual public A {};

class D : public B, public C {};

        虚继承的实现机制主要通过在虚继承体系下创建一个虚基类表(virtual base class table,简称 vbtable)和调整对象的内存布局来解决资源冗余和二义性问题,具体如下:

在内存角度:

        在非虚继承的菱形继承中,派生类 D 的对象内存布局会依次包含 B 类部分(其中包含一份 A 的成员)和 C 类部分(其中又包含一份 A 的成员)。

         而在虚继承情况下,派生类 D 的对象内存布局会先有一个指向虚基类表(vbtable)的指针(如果有多个虚基类,可能只有一个这样的指针,具体实现依赖于编译器),然后是 B 类和 C 类各自特有的成员部分,而对于公共的虚基类 A 的成员,只会存在一份,通常放在对象内存布局的末尾(同样,具体位置和布局方式由编译器决定,但关键是只有一份)。

虚基类表的作用:

        虚基类表用于记录每个虚继承的派生类与虚基类之间的偏移量等信息。

        对于类 D,它通过虚继承同时继承了 B 和 C,而 B 和 C 又虚继承了 A。当 D 的对象需要访问虚基类 A 的成员时,会先通过对象中的虚基类表指针找到虚基类表,然后根据表中的偏移量信息,准确地定位到唯一一份虚基类 A 的成员所在位置,从而避免了访问到重复的成员,解决了资源冗余和二义性的问题。


http://www.kler.cn/a/412304.html

相关文章:

  • 从零开始学 Maven:简化 Java 项目的构建与管理
  • 34 基于单片机的指纹打卡系统
  • Cocos简介和认知
  • 【机器学习chp7】SVM
  • 计算机网络的功能
  • 什么是 WPF 中的依赖属性?有什么作用?
  • EasyAnimate:基于Transformer架构的高性能长视频生成方法
  • LeetCode 2924. Find Champion II
  • CRTP mixins EBO
  • 代理模式 (Proxy Pattern)
  • C#基础36-40
  • 【大数据测试 Elasticsearch 的 四大 常见问题及处理方案】
  • 【模糊查询Redis的Key,过滤出其中ZSET类型中包含自定义字符串的元素并删除】
  • 老旧前端项目如何升级工程化的项目
  • 鸿蒙Native使用Demo
  • ubuntu使用Docker,安装,删除,改源等记录
  • 类的加载机制
  • 自制Windows系统(十)
  • Unity 设计模式-单例模式(Singleton)详解
  • 【大数据学习 | Spark-Core】Spark中的join原理
  • 双向链表、循环链表、栈
  • Docker desktop 改变存储位置
  • VUE练习
  • Hive的基础函数
  • 英语知识在线平台:Spring Boot技术探索
  • 流媒体拥塞控制与流控