菱形继承的问题以及解决方法

大家好:

        衷心希望各位点赞。

        您的问题请留在评论区,我会及时回答。

菱形继承概念

两个派生类继承同一个基类

又有一个类同时继承这两个派生类

这种继承被称为菱形继承,或者钻石继承。

        基类A同时派生出类B和类C,派生类D又同时继承类B和类D,这就是菱形继承。

菱形继承的问题

        类B和类C都继承了基类A的数据,这样的话,当类D访问数据时就有可能发生二义性,

        类D把基类A的数据继承了两份,但是,这份数据其实我们只需要一份就可以了。

#include <iostream>
#include <Windows.h>using namespace std;class A
{
public:int a;A(){a = 0;}
};class B : public A
{// 类B继承一份数据a
};class C : public A
{// 类C继承一份数据a
};class D : public B, public C
{// 类D继承两份数据a,分别来自类B和类C
};int main(void)
{D d;cout << d.a << endl; // 报错:访问d.a不明确,因为D继承了两个变量asystem("pause");return 0;
}

解决方法:

        利用虚继承,解决菱形继承所导致继承两份基类数据的问题。这样的话,派生类D就只会继承一份基类A的数据。

        在基类的继承方式前,加上关键字 virtual ,此时,基类称为虚基类。

#include <iostream>
#include <Windows.h>using namespace std;class A
{
public:int a;A(){a = 10;}
};class B : virtual public A // 虚基类A
{/**类B继承虚基类指针vbptr,指向虚基类表vbtable(存放偏移量)。*vbptr加上vbtable的偏移量就能指向基类A的数据,这样,就只用保存一份基类A的数据。*/
};class C : virtual public A
{/**类C继承虚基类指针vbptr,指向虚基类表vbtable(存放偏移量)。*vbptr加上vbtable的偏移量就能指向基类A的数据,这样,就只用保存一份基类A的数据。*/
};class D : public B, public C
{// 类D只继承了一份数据a
};int main(void)
{D d;cout << d.a << endl; // 打印10,只有一份数据a system("pause");return 0;
}

运行截图:

 总结

        菱形继承导致的问题:子类继承两份相同的数据,导致内存资源浪费且毫无意义。

        利用虚继承,可以解决菱形继承导致的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ARM 的Linux系统的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在 MacOS 中安装 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告 本教程可以包含过时的信息。 此步骤已在 Ubuntu Linux 12.04 上进行了测试&#xff0c;但应…

NOIP2011 数字反转 灰常经典的一道

[NOIP2011 普及组] 数字反转 - 洛谷https://www.luogu.com.cn/problem/P1307 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int Nsc.nextInt();int fanzhuanNumfanZhuan(N);System.out.print(fa…

WSL使用

WSL使用 WSL安装和使用 Termianl和Ubuntu的安装 打开Hype-V虚拟化配置Microsoft Store中搜索Window Terminal并安装Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本打开Window Terminal选择Ubuntu标签栏, 进入命令行 中文输入法安装 查看是否安装了fcitx框架…

二分图

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 二分图&#xff1a;节点由两个集合组成&#xff0c;且两个集合内部没有边的图。换言之&#xff0c;存在一种方案&#xff0c;将节点划分成满足以上性质的两个集合。 染色法 目的&#xff1a;验证给定的二分图是否可…

springboot3使用​自定义注解+Jackson优雅实现接口数据脱敏

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义脱敏注解 2.编写脱敏策略枚举类 3.编写JSON序列化实现 4.编写测…

日常刷题之77-组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案 提示&#xff1a;假设 n5,k3 就是需要组合出来&#xff0c;长度3且内容数据是在[1,n]这个区间内的所有可能得组合 同时一个组合里面内个数字只能出现一次&#…

亮数据代理IP轻松解决爬虫数据采集痛点

文章目录 一、爬虫数据采集痛点二、为什么使用代理IP可以解决&#xff1f;2.1 爬虫和代理IP的关系2.2 使用代理IP的好处 三、亮数据代理IP的优势3.1 IP种类丰富3.1.1 动态住宅代理IP3.1.2 静态住宅代理IP3.1.3 机房代理IP3.1.4 移动代理IP 3.2 高质量IP全球覆盖3.3 超级代理服务…

Java标签提高for循环运行效率,减少资源开销

一&#xff0c;Java标签提高for循环运行效率,减少资源开销 少说先看代码再讲解 List<Long> lefts new ArrayList<>(); List<Long> rights new ArrayList<>(); lefts.add(0L); lefts.add(1L); lefts.add(2L); lefts.add(3L); lefts.add(4L); lefts.…

修改Linux系统时间与网络同步

文章目录 1、安装ntpdate2、修改时区3、设置系统时间与网络时间同步4、将系统时间写入硬件时间 1、安装ntpdate # Red Hat和Cent OS系统 sudo yum install ntpdate # 乌班图 sudo apt-get install ntpdate2、修改时区 1&#xff09;运行tzselect tzselect2&#xff09;选择A…

52、Qt/窗口、常用类、ui相关学习20240321

一、使用Qt 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c;通过代码实现 3. 需要添加适当的动图。 代码&#xff1a; #include "widget.h" #incl…

两台不同账号同一区域阿里云服务器如何实现内网互通?

登录阿里云平台 [开通peer对等] 点击右上角的控制台&#xff0c;然后进行搜索专有网络VPC。 点击进入专有网络VPC界面操作步骤如下&#xff1a; &#xff08;1&#xff09;点击VPC对等连接&#xff0c;然后开通VPC对等连接后创建对等连接。 &#xff08;2&#xff09;在另…

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

OpenCV4.9.0开源计算机视觉库安装教程

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 引言&#xff1a;OpenCV系列文章中的安装部分今天全部完成了&#xff0c;为了读者更方便阅读&#xff0c;大家可以按下列索引前往&#xff0c;成文较为仓促有错漏在所难免&#xff0c;欢迎大家指正…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务&#xff0c;不仅仅是Apache、MySQL&#xff0c;其他服务也可以使用同样的方法操作&#xff0c;包括开启自己写的脚本服务。 二、效果图 两种状…

JavaSE—IO流之字符流

&#x1f4cc; 字符流中的常用类及基本方法&#xff1a; 输入字符流 Reader输出字符流 Writer ○ Reader 的基本方法&#xff1a; • 读取一个字符并以整数的形式返回, 如果返回-1已到输入流的末尾。 int read() throws IOException • 读取一系列字符并存储到一个数组buff…

BufferedInputStream解读

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java之IO流啦&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好习惯&am…

继承和多态(2)(多态部分)

提前讲的重要知识点 一个类在没有父类的情况下默认有一个父类为Object类。 而当在有父类情况下&#xff0c;如果你那父类没有父类&#xff0c;则其父类的父类默认为object类&#xff0c;所以即使一个类有父类&#xff0c;其内部还是有object类。 object类都是隐藏起来的&…

【周总结】

周总结 完成项目混合版时区改造 完成相关jira问题的修改 完成老版本APP数据保存接口的兼容&#xff0c;手动赋值时区 2024/03/24 天气阴 一点不冷 1.Its time to go、Spring is coming&#xff01; 2. Its a nice day that staying with friends in a peaceful …

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…