【C++ 继承】关于多继承、菱形继承你了解多少?

news2025/2/6 23:56:32

文章目录

      • 1. 为什么 C++ 有多继承,Java 没有多继承呢?
      • 2. 什么是菱形继承呢?
      • 3. 菱形继承产生数据冗余和二义性问题

1. 为什么 C++ 有多继承,Java 没有多继承呢?

C++ 实现多继承是为了满足某些场景的需要,但是有多继承就一定会有 菱形继承的情况,菱形继承会导致数据冗余和二义性问题,所以菱形继承需要避免,这是一个bug,所以Java为了避免菱形继承,通过单继承和接口来实现,没有多继承。

2. 什么是菱形继承呢?

  • ① 如下图所示,就是一个菱形继承,注意❗:菱形继承不代表一定要满足菱形。
  • ② 一个派生类同时继承自两个或多个基类,而这些基类又继承自同一个共同的基类,形成了一个菱形的继承结构。
    在这里插入图片描述

3. 菱形继承产生数据冗余和二义性问题

数据冗余:
① 如下图所示,明明是同一个人,却存了两个名字;

② 菱形继承可能会造成重复存储相同的成员变量,增加了内存消耗;

二义性:
① 当研究生助理为学生的时候,他叫小张,当他为老师的时候,他又叫张老师,那么此时就会存在一个问题,他到底叫什么呢?

② 如果派生类继承的两个基类都有相同的函数,并且派生类中没有对这些函数进行覆盖或隐藏,那么在派生类中调用这些函数时,编译器无法确定要调用哪个版本的函数,从而导致二义性。

在这里插入图片描述

  • 如何解决菱形继承问题的呢?

在 C++ 中,可以通过虚继承(Virtual Inheritance)来解决菱形继承所带来的数据冗余和二义性问题。虚继承是一种特殊的继承方式,可以确保共同基类在派生类中只有一份实例,从而避免了数据冗余和二义性问题。

在这里插入图片描述

  • 为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系,再借助内存窗口观察对象成
    员的模型。
#include <iostream>

using namespace std;

class A
{
public:
	int _a;
};


// class B : public A
class B : virtual public A
{
public:
	int _b;
};


// class C : public A
class C : virtual public A
{
public:
	int _c;
};


class D : public B, public C
{
public:
	int _d;
};


int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;

	return 0;
}

在这里插入图片描述

  • 下图是菱形虚拟继承的内存对象成员模型:这里可以分析出D对象中将A放到的了对象组成的最下
    面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是通过了B和C的两个指针,指
    向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量
    可以找到下面的A。
    在这里插入图片描述
  • 下面是Person关系菱形虚拟继承的原理解释:
    在这里插入图片描述

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

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

相关文章

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

【附gpt4.0升级秘笈】百度智能云万源全新一代智能计算操作系统发布:引领AI新纪元

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为引领未来发展的关键技术&#xff0c;正逐步渗透到社会的每一个角落。百度&#xff0c;作为中国AI领域的领军企业&#xff0c;始终站在技术创新的前沿&#xff0c;不断推出引领行业的重磅产品。今日&…

【小贴士|Unity】华佗热更版本控制配置

现在越来越多的新项目选择使用HybridCLR&#xff0c;而不是以前的Lua。也不妨有的项目会配置打包机器人以及版本控制&#xff0c;但是这个版本控制的配置还真需要注意一些。&#xff08;因为我就踩坑了&#xff09; 如图所示&#xff0c;当你第一次执行HybridCLR/Generate/All后…

渲染农场怎么收费?渲染100邀请码1a12

随着互联网的发展&#xff0c;越来越多的影视、动画和广告项目涌现出来&#xff0c;为了加快渲染&#xff0c;很多视觉工作者都会使用渲染农场&#xff0c;现在市面上的农场那么多&#xff0c;它们有什么收费模式&#xff1f;性价比如何&#xff1f;这篇文章我们就来看下吧。 1…

leetcode199 二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 解析 这道题首先能想到的办法&#xff0c;就是使用迭代法层次遍历&…

《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)

1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中&#xff0c;但是如果需要发给相关人需要你拷贝出来&#xff0c;有时候由于控制台窗口的限制&#xff0c;有部分日志将会无法查看&#xff0c;因此我们还是需要将日志输出到文件中&#xff0c;因此今天主要介绍和分…

视频号小店被严重低估,私域电商再次崛起,这次真的不一样!

大家好&#xff0c;我是电商笨笨熊 在视频号正式推出电商之后&#xff0c;我听到过很多贬低的话&#xff1b; 有人觉得腾讯没有做电商的基因&#xff0c; 有人觉得这不过是资本打一枪换一个地方罢了&#xff0c;最终都是普通人承担后果&#xff0c; 总之&#xff0c;这样的…

华为海思数字芯片设计笔试第五套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

【Zabbix】zabbix 软件监控

使用zabbix监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控…

three.js两大神器:粒子效果与补间动画,很好很强大!

本期介绍three.js的两大神奇&#xff0c;开始了。 一、什么是粒子效果 粒子效果在计算机图形学和动画中有多种应用和作用。以下是一些常见的粒子效果的应用和作用&#xff1a; 创建自然现象&#xff1a;粒子效果可以用来模拟自然现象&#xff0c;如雨、雪、火焰、烟雾、云等。…

Day91:API攻防-接口安全SOAPOpenAPIRESTful分类特征导入项目联动检测

目录 API分类特征-SOAP&OpenAPI&RESTful API分类特征 API常见漏洞 API检测流程 API检测项目-Postman&APIKit&XRAY 工具自动化-SOAP - WSDL Postman 联动burpxray APIKit插件(可联动xray) 工具自动化-OpenApi - Swagger Postman 联动burpxray APIKit…

[Algorithm][双指针][复写零][快乐数][盛水最多的容器][有效三角形的个数]详细解读 + 代码实现

目录 1.复写零1.题目链接2.算法原理讲解3.代码实现 2.快乐数1.题目链接2.算法原理讲解3.代码实现 3.盛水最多的容器1.题目链接2.算法原理讲解3.代码实现 4.有效三角形的个数1.题目链接2.算法原理讲解3.代码实现 1.复写零 1.题目链接 题目链接 2.算法原理讲解 先找到最后一个…

使用python在本地指定的目录临时模拟服务器,看懂这份Python面经大厂真不是问题

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

Unity MySql安装部署与Unity连接 下篇

一、前言 上篇讲到了如何安装与部署本地MySql&#xff1b;本篇主要讲Unity与MySql连接、创建表、删除表&#xff0c;然后就是对表中数据的增、删、改、查等操作。再讲这些之前会说一些安装MySql碰到的一些问题和Unity连接的问题。 当把本地MySql部署好之后&#xff0c;我们可能…

如何简单下载指定版本的jdk

Oracle 官方提供的 Java Development Kit (JDK) 的归档站点。它主要用于存放历史版本的 JDK&#xff0c;供开发者下载和使用。 附上站点地址&#xff1a;Archived OpenJDK GA Releases 在这个站点可以找到各版本的jdk&#xff0c;简单实用~ 找到版本&#xff0c;点击tar.gz进…

【Origin+Python】使用External Python批量出图代码参考2

目录 前情提要进阶代码去除水印 前情提要 基础教程见链接: 【OriginPython】使用External Python批量出图代码参考 这里主要介绍一些进阶代码以及使用盗版origin要如何去除水印的方法&#xff01; ############################################################# 进阶代码 …

轻松上手MYSQL:MYSQL初识(上)

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《MYSQL入门》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 轻松上手MYSQL&#xff1a;从零开始构建你的数据库世界 &#x1f680; &#x1f680;欢迎来到My…

关于android studio无法连接到荣耀手机的超级简单终极解决办法

首先我要吐槽下网上那么多人那么多文章没一个有用的。亲测机型&#xff1a;荣耀40c 首先官方指导&#xff1a; 1.换数据线 2.开发者模式----》》》关闭锁屏----》》》打开唤醒 3.安装adb 驱动 下面几点是误区&#xff1a;千万别碰&#xff0c;浪费大家时间 被网上文章误解…

【Next】动态路由、加载 UI 和流式传输

动态路由 动态段作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。 /app/blog/[slug]/page.tsx export default function Page({params}: {params:{slug:string}}) {return <h1>Slug Page -- {params.slug}</h1> };/app/shop/[...slug]/pa…

SAP 技巧篇:Script脚本模拟人工操作批量录入数据

“ 现在大环境都讲人工智能、自动化办公等场景的应用&#xff0c;这里我们介绍一下SAP本身自带的自动化工具” 文章最后附最终脚本 01 — 背景需求 SAP&#xff1a;批量录入工具&#xff1a;LSMW/BDC/Script 三大工具 LSMW&#xff1a;应用场景多&#xff0c;实现方法多&am…