首页 > 编程语言 >C++虚继承

C++虚继承

时间:2024-03-12 22:34:47浏览次数:18  
标签:派生 继承 成员 基类 C++ 派生类 构造函数

虚继承(Virtual Inheritance)

为了解决多继承时的命名冲突和冗余数据问题,c++提出了虚继承,使得在派生类中只保留一份间接基类的成员

在继承方式前面加上 virtual 关键字就是虚继承

虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)

                              

                 

虚继承的一个不太直观的特征:必须在虚派生的真实需求出现前就已经完成虚派生的操作.

图中,当定义 D 类时才出现了对虚派生的需求,但是如果 B 类和 C 类不是从 A 类虚派生得到的,那么 D 类还是会保留 A 类的两份成员。

虚派生只影响从指定了虚基类的派生类中进一步派生出来的类,它不会影响派生类本身。

虚基类成员的可见性

因为在虚继承的最终派生类中只保留了一份虚基类的成员,所以该成员可以被直接访问,不会产生二义性。此外,如果虚基类的成员只被一条派生路径覆盖,那么仍然可以直接访问这个被覆盖的成员。但是如果该成员被两条或多条路径覆盖了,那就不能直接访问了,此时必须指明该成员属于哪个类。

以图中的菱形继承为例,假设 A 定义了一个名为 x 的成员变量,当我们在 D 中直接访问 x 时,会有三种可能性:

    • 如果 B 和 C 中都没有 x 的定义,那么 x 将被解析为 A 的成员,此时不存在二义性。
    • 如果 B 或 C 其中的一个类定义了 x,也不会有二义性,派生类的 x 比虚基类的 x 优先级更高。
    • 如果 B 和 C 中都定义了 x,那么直接访问 x 将产生二义性问题

C++虚继承时的构造函数

虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。

 

标签:派生,继承,成员,基类,C++,派生类,构造函数
From: https://www.cnblogs.com/uacs2024/p/18069509

相关文章

  • 命令行 要查看在Windows上已安装的所有.NET Framework版本 查看在Windows上已安装的
       要查看在Windows上已安装的所有.NETFramework版本,可以按照以下步骤执行:打开命令提示符(CommandPrompt)或PowerShell。可以通过在Windows搜索栏中键入“cmd”或“PowerShell”来找到并打开这些应用程序。在命令提示符或PowerShell中,输入以下命令并按Enter键:......
  • 【C++】string类(介绍、常用接口)
    ......
  • windows、C++怎么看线程在哪个核上运行
    一.要在Windows系统上查看线程运行在哪个处理器核心上,可以使用Windows系统提供的一些工具和方法。在Windows中,可以使用以下几种方式来查看线程运行的处理器核心:使用任务管理器打开任务管理器:可以通过按下 Ctrl+Shift+Esc 组合键快速打开任务管理器,或者通过右键......
  • nodejs集成C++代码:手写简单的addon
    文章目录nodejs与node-gyp手写一个简单的addon编写一个简单的binding.gyp文件编写C++源文件V8版本:addon.ccnapi_api版本:addon_api.cc编译命令JS调用在这个专栏里,已经提到过web系统中c++的两大应用场景了:assembly和cef框架的应用,这两个可以说都是客户......
  • 【华为OD机试】真题B卷-最大花费金额(C++)
    华为OD机试真题汇总目录  【华为OD机试】真题汇总A+B+C+D券(Python实现)  【华为OD机试】真题汇总A+B+C+D卷(JAVA实现)  【华为OD机试】真题汇总A+B+C+D卷(C++实现)一、题目题目描述:双十一众多商品进行打折销售,小明想购买自己心仪的一些物品,但由于受购买资金限制,......
  • C++看程序写结果 虚函数、构造、析构、初始化列表
    虚函数、构造、析构、初始化列表#include<iostream>usingnamespacestd;classBase{public:Base(constchar*p_szName):m_szName(p_szName){cout<<"Base类构造:"<<m_szName<<","<<endl;}virtual~Base(){cout......
  • VScode调用MSVC编译C++文件
    批处理.bat@echooffchcp65001ifnot"%~1"==""(setpos="%~1"&gotorun)set/ppos=工程路径Workspacepath::runcall"E:\ProgramFiles\MicrosoftVisualStudio\2022\Community\Common7\Tools\VsDevCmd.bat"code......
  • C++ 字符串和字符操作
    1.头文件#inlcude<string>2.std::string&char*区别char*是一个指针string是一个类,内部封装了char,是一个char管理容器3.std::string&C-style字符串区别std::string是C++标准库中的字符串类,提供了许多字符串操作的方法和功能,包括长度计算、拼接、查找、替换等......
  • C++新U4-贪心算法2
    [【贪心算法(二)】分发饼干]    【题意分析】将饼干分发孩子手上,并且使得满足的孩子数量最多【思路分析】为了尽可能满足最多数量的孩子,按照孩子想要获得的饼干大小从小到大的顺序依次满足每个孩子,且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼......
  • C++ Qt开发:QNetworkAccessManager网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkAccessManager组件实现Web网页访问。QNetworkAccessManager是Qt网络模块中的关......