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

23、什么是菱形继承【中高频】

  • 单继承:一个子类只有一个父类 称为单继承

  • 多继承:一个子类有两个或以上父类 称为多继承

    在这里插入图片描述
  • 菱形继承:两个派生类继承同一个基类,又有某个类同时继承者两个派生类。

    在这里插入图片描述
  class Person
  {
  public:
  	string _name; // 姓名
  };
  
  class Student : public Person
  {
  protected:
  	int _stu_id; //学号
  };
  
  class Teacher : public Person
  {
  protected:
  	int _emp_id; // 职工编号
  };
  
  class Assistant : public Student, public Teacher
  {
  protected:
  	string _majorCourse; // 主修课程
  };
  • 这种结构会导致 基类的成员 在最派生类中出现两次,因为 两个派生类 各自继承了 基类的成员,而最派生类又继承了 这两个派生类。这可能会导致两个问题

    • 冗余性:即代码的重复。派生类会继承基类的成员。如果这些成员在两个基类中定义了相同的实现,那么在派生类中就会有重复的代码,浪费内存空间

    • 二义性:两个基类提供了相同的函数或数据成员,子类对象调用时确定不了调用哪个版本。

Assistant a ;
a._name = "阿杰"; // _name不明确,编译错误

//我们可以指定 该成员变量的父类解决该问题:
a.Student::_name = "阿伟";
a.Teacher::_name = "淑慧";
//但依然没有解决数据冗余的问题,为了解决该问题,我们引用虚拟继承的概念:
img
  • 解决方法:虚拟继承

    如上面的继承关系,在 Student 和 Teacher 的继承 Person 时使用 虚拟继承,即可解决问题。另外需要注意:虚拟继承不要在其他地方去使用。

  class Person
  {
  public :
  	string _name ; // 姓名
  };
  
  class Student : virtual public Person
  {
  protected :
  	int _stu_num ; //学号
  };
  
  class Teacher : virtual public Person
  {
  protected :
  	int _e_id ; // 职工编号
  };
  
  class Assistant : public Student, public Teacher
  {
  protected :
  	string _majorCourse; // 主修课程
  };
  
  void Test ()
  {
  	Assistant a;
  	a._name = "阿伟";
  }

上面的代码执行后,不会出错,程序会将Assistant a的_name 变量 改变

  • 虚拟继承的原理:

    虚拟继承使得 虚基类对象单独存储,由子类用指针访问,并不是之前的嵌入到每个派生类对象中。也就是说,当多个类继承同一个虚基类时,它们共享同一个虚基类对象。这个虚基类子对象只被构造一次,而不是被每个派生类分别构造,因此可以消除数据冗余和二义性。(需要注意的是,虚拟继承有一些性能上的开销,因为每次访问虚基类时需要间接寻址)

  • 虚继承对象的构造顺序:最远派生类优先即 最远派生类构造函数 优先调用 虚基类的构造函数

  class A { /* 虚基类 */ };
  class B : virtual public A { /* 中间派生类 */ };
  class C : virtual public A { /* 中间派生类 */ };
  class D : public B, public C { /* 最远派生类 */ };

在这里插入图片描述

​ (非虚继承的基类仍按常规顺序初始化)

相关文章:

  • el-tree(append与getNode与过滤)、深拷贝deepClone、监听addEventListener、
  • Aruco 库详解:计算机视觉中的高效标记检测工具
  • C++ 接口(抽象类)
  • 深入理解 CAS 与 ABA 问题
  • 基于Docker去创建MySQL的主从架构
  • Xss漏洞问题
  • 特定领域软件架构DSSA
  • 五、数组维度
  • 批量合并 Word 文档,支持合并成一个 Word,也支持按文件夹合并
  • 网络安全技术整体架构 一个中心三重防护
  • 进程间的通信1
  • Jetson Orin 安装 onnxruntime
  • Web3中的AI:一种去中心化智能的完整指南
  • 奥运会运动员年龄规定·棒球1号位
  • 【C++】5.6 try语句和异常处理
  • C# 命名空间(Namespace)详解
  • 稀疏注意力:打破Transformer计算瓶颈,实现高效长序列建模
  • ES02 - ES语句
  • TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试
  • C/C++ 实现由用户通过键盘输入自然数并判断其是不是素数(带清空缓冲区等考虑)
  • 网站备案之前需要建好网站吗/楚雄seo
  • 响应式h5网站多少钱/线上推广方式都有哪些
  • 衡水专业做wap网站/长沙网站seo外包
  • cpu wordpress/重庆网站页面优化
  • 做网站如何用模板/石家庄百度关键词搜索
  • 一个网站怎么做软件好用/上海搜索seo