首页 > 编程语言 >【C++核心编程】菱形继承&虚基类

【C++核心编程】菱形继承&虚基类

时间:2024-06-15 12:29:30浏览次数:29  
标签:继承 编程 C++ public A1 菱形 基类 class

多继承

多继承的语法:

class 派生类名: [继承方式1] 基类名1, [继承方式2] 基类名2,......
{
派生类新增加的成员
};

不提倡使用多继承,只有在比较简单和不出现二义性的情况时才使用多继承,能用单一继承解决的问题就不要使用多继承。

如果继承的层次很多、关系很复杂,程序的编写、调试和维护工作都会变得更加困难,由于这个原因,C++之后的很多面向对象的编程语言,例如Java,C#,PHP等,都不支持多继承。

多继承示例

#include <iostream>         
using namespace std;        
           
class A1 {        // 基类一
public:
int m_a = 10;
};
      
class A2 {        // 基类二
public:
int m_a = 20;
};
        
class B :public A1, public A2 {       // 派生类
public:
int m_a = 30;
};  
int main()
{
B b;
cout << "B::m_a的值是:" << b.m_a << endl;
cout << "A1::m_a的值是:" << b.A1::m_a << endl;
cout << "A2::m_a的值是:" << b.A2::m_a << endl;
}

菱形继承

有了多继承,就存在菱形继承,有了菱形继承就有虚继承,增加了复杂性

菱形继承指的是:一个基类被两个中间类继承,而这两个中间类又被另一个类共同继承,形成一个菱形的结构。如果不使用虚基类,这会导致最终的派生类中存在多个基类的副本,从而引起数据冗余和混淆。

菱形继承示例

class A1 {
public:
    int m_a;
};

class A2 : public A1 {};

class A3 : public A1 {};

class AAA : public A2, public A3 {};

在这个例子中,AAA类会包含两个 A1类的实例,一个通过 A2继承,另一个通过 A3 继承。这样一来,AAA类会有两个 m_a成员,导致访问 m_a成员时产生歧义。

解决方案:虚基类

虚基类是C++中的一种机制,可以解决多重继承时的"菱形继承"问题。通过使用虚基类,C++ 提供了一种方式,使得类只会有一个共享的副本,从而解决菱形继承问题。

虚基类示例

class A1 {
public:
    int m_a;
};

class A2 : virtual public A1 {};

class A3 : virtual public A1 {};

class AAA : public A2, public A3 {};

在这个例子中,A2A3都虚拟继承自 A1,使得 AAA类只有一个 A1类的实例。因此,AAA类中的 m_a成员不会产生歧义。

虚基类使用场景

虚基类通常用于以下场景:

  • 菱形继承:如上所述,解决菱形继承导致的冗余和歧义问题。
  • 复杂继承体系:在复杂的继承体系中,虚基类可以帮助管理和简化基类实例的共享。

标签:继承,编程,C++,public,A1,菱形,基类,class
From: https://blog.csdn.net/Coldreams/article/details/139698669

相关文章

  • 自动化生成C/C++单元测试覆盖率报告!
    覆盖率生成脚本化处理在《生成单元覆盖率》一文中,我们已经可以成功的生成代码覆盖率报告,但是,不知道各位读者有没发现,整个过程是有一定繁杂的,多个命令搭配诸多不同的参数,对于初初接触的人来说,敲一下看一眼,生怕敲错、或者cv大法来来回回好几趟,生成个报告,没个三几分钟都不行;对......
  • C/C++生成单元测试覆盖率
    生成单元测试覆盖率前文提到添加了编译参数-fprofile-arcs、-ftest-coverage已经生成了gcno文件,单元测试运行后也产生了gcda文件。并且我们已经安装好lcov,那么该如何使用lcov来生成覆盖率报告呢?进入到我们生成了*.gcno*.gcda文件的目录收集覆盖率数据(*.gcda)并......
  • 【C++ | const成员】一文了解类的 const数据成员、const成员函数、const对象、mutable
    ......
  • OpenGL3.3_C++_Windows(10)
    最终演示​demo演示Assimp模型渲染模型导入库Assimp:导入很多种不同的模型文件格式,加载至Assimp的通用数据结构(树形)中,不论导入的是什么种类的文件格式,用同一种方式访问我们需要的数据。Assimp库配置:premake5.lua:cmake构建出sln,对于assimpproject构建动态库......
  • OpenGL3.3_C++_Windows(9)
    最终效果demo演示多光源原理:所有投光物分别计算,对当前片段的影响,再+求和,渲染出物体的材质效果每个投光物:根据冯氏光照(环境,漫反射,镜面)分解计算对片段的强度影响,再与当前片段颜色值(单一颜色/纹理颜色)*相乘每个投光物也会对(环境,漫反射,镜面)有不同的影响程度通......
  • Vue2学习九-Vue组件化编程(非单文件组件、单文件组件)
    18.非单文件组件18.1.基本使用Vue中使用组件的三大步骤: 一、定义组件(创建组件) 二、注册组件 三、使用组件(写组件标签)一、如何定义一个组件? 使用Vue.extend(options)创建,其中options和newVue(options)时传入的那个options几乎一样,但也有点区别; 区别如下: 1.......
  • C/C++中的extern关键词
    于《C++Primer》的学习中遇到extern关键词的详细解释以下将抛开复杂的解释,仅于简单上手的使用方面进行非专业的介绍。倘若我们有多个文件如头文件,文件1,文件2...,而我们想将一个变量或者一个函数于多个文件中同时使用(如文件2中定义了一个函数或者变量,则可在文件1或其他文件直接调......
  • 【华为OD机试真题】159、星际篮球争霸赛 | 机试真题+思路参考+代码解析(C++、Java、Py
    文章目录一、题目......
  • 【华为OD机试真题】155、计算数组中心位置 | 机试真题+思路参考+代码解析(C++、Java、P
    文章目录一、题目......
  • 计算机毕业设计项目推荐,32762 外卖app系统设计与实现(开题答辩+程序定制+全套文案 )上万
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,餐饮外卖当然也不例外。外卖app系统主要功能模块包括后台首页,轮播图,资源管理(餐饮新闻,新闻分类),系统用户(注册用户,配送员,注册商家)模块管理(美食信息,外卖点餐,配......