【C/C++】菱形继承问题

ops/2024/9/25 21:26:51/

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

c语言】全部知识点总结


目录

    • 一、什么是菱形继承
    • 二、菱形继承带来的问题
    • 三、解决菱形继承问题的方法——虚继承
    • 四、虚继承的原理和实现机制

一、什么是菱形继承

菱形继承是一种多重继承的特殊情况。当一个类从两个或多个基类派生,而这些基类又有共同的基类时,就形成了菱形继承结构。

image.png

class Base
{
public:int value;void fun();
};class Derived1 : public Base 
{
};class Derived2 : public Base 
{
};class Derived3 : public Derived1, public Derived2
{
};

Derived3类通过Derived1Derived2间接继承了Base

二、菱形继承带来的问题

数据冗余和二义性

  1. 由于Derived3继承了Derived1Derived2,而它们又都继承自Base,这可能导致Derived3中存在两份Base类的数据成员
  2. 当访问Base类中的成员时,会产生二义性。例如,如果在Derived3中访问 value 成员,编译器无法确定应该使用从Derived1继承的 value 还是从Derived2继承的 value

三、解决菱形继承问题的方法——虚继承

为了解决菱形继承带来的问题,C++引入了虚继承的概念。虚继承使得在多重继承中,公共基类在派生类中只存在一份实例
使用虚继承:

class Base 
{
public:int value;void fun();
};class Derived1 : virtual public Base 
{
};class Derived2 : virtual public Base
{
};class Derived3 : public Derived1, public Derived2 
{
};

Derived1Derived2都以虚继承的方式继承自Base

Derived3中只会有一份Base类的实例,避免了数据冗余和二义性问题。

四、虚继承的原理和实现机制

虚继承通过在派生类的对象布局中插入一个指向虚基类表的指针来实现

虚基类表中存储了虚基类在对象中的偏移量等信息,使得在访问虚基类成员时能够正确地定位到唯一的实例。
当使用虚继承时,编译器会在派生类的构造函数中初始化虚基类
这确保了虚基类的构造函数只被调用一次,无论继承层次有多深。


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

http://www.ppmy.cn/ops/98023.html

相关文章

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…

消息队列篇

1、队列简介 概念&#xff1a; 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff0c;说白了&#xff0c;队列就是用来传递消息的。 ----------------------------------------------------------------------------------------------------------------…

测试用例设计:腾讯应用宝的下载功能怎么测试?

一、功能测试 1. 正常下载流程 • 在应用宝中搜索一个已知的应用&#xff0c;如微信。确认搜索结果准确显示该应用。 • 点击下载按钮&#xff0c;观察下载进度条是否正常显示&#xff0c;下载速度是否合理。 • 下载过程中暂停和继续下载功能是否正常。 • 下载完成后&am…

深入浅出链表

目录 1.链表的基本概念及结构 1.1基本概念 1.2结构 2.链表的分类 3.链表的实现&#xff08;循环链表增删查改实现&#xff09; 1.动态申请节点&#xff08;结点&#xff09;​编辑 2.单链表打印 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 …

解锁智能家居新体验:KNX网关的无限可能

解锁智能家居新体验&#xff1a;KNX网关的无限可能 在智能家居的浪潮中&#xff0c;KNX网关如同一把钥匙&#xff0c;悄然打开了通往未来生活的大门。它不仅是智能家居系统的核心枢纽&#xff0c;更是连接现实与梦想的桥梁&#xff0c;让我们的生活因智能而变得更加精彩。 想象…

金蝶云星空元数据冲突SVN:replaced,tree conflict树冲突解决过程

文章目录 SVN:replaced,tree conflict树冲突解决过程问题解决方案 SVN:replaced,tree conflict树冲突解决过程 问题 解决方案

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…

智能测绘领域的佼佼者:CASS11.0中望平台版(支持中望CAD2018-2024平台)CASS信创版又将引领地信产业前行

CASS11.0 for ZWCAD2024&#xff08;共享版&#xff09;百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/14pPezG_wVNK5cfNUEws70…