菱形继承、菱形虚拟继承、以及菱形虚拟继承的模型结构内部。

news2024/9/21 20:23:10

1. 单继承:一个子类只有一个直接父类。

 

多继承:一个子类有两个或以上直接父类。

菱形继承:菱形继承是多继承的一种特殊情况。 

 

下面是代码和对象模型结构,可以看出菱形结构存在哪些问题,如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

class A
{
public:
	int _a;
};


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


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

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

那么我要访问 _a,会出现什么?

 

 

因为 B 和 C 都继承了 A 中的 _a,所有访问 _a 的话,不明确访问的是哪个 _a,需要指定访问,如下:

  

下面是对象模型结构图,如下:

菱形继承问题:从上面的代码和对象模型结构中可以看到菱形继承有数据冗余和二义性问题。

D 继承 B、C之后,D 的对象中有两份 A 的成员。  

那么怎么解决呢?这里就要用到虚拟继承,虚拟继承可以解决菱形继承的二义性和数据冗余的问题,怎么用?如下:

class A
{
public:
	int _a;
};

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


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;
}

在 B、C 继承 A 的时候,加上 virtual 就可以了。

下面借助调试窗口看一下菱形继承之后,不加 virtual,那么内部是什么样?

可以看到 d 对象中存在两个 _a,存在数据冗余。

那么虚拟继承之后呢,下面 加virtual 看一下,如下?

上图中可以看到,D 对象中把 _a 放到了最下面,相比于不加virtual的时候,B、C 对象中没有了 _a 但是多了一个地址,这个地址就是去找 _a 的,这个地址就是指向一张表的,这个表叫虚机表,指向虚机表的指针叫虚机表指针,虚机表中存的是偏移量,通过偏移量可以找到_a。

总结:虚继承之后,B、C对象里面没有了 _a,但是多了一个指针,这个指针是找 _a 的,先找到虚机表,在获取里面的偏移量,再拿偏移量找 _a。

下面我打开两个内存窗口调试看一下,如下:

 

 

B 中找偏移量是 20,不难看出地址是 4 字节(32位下),_a 在第 5 个位置;C 与 B 类似。

总结:

1. 能不用菱形继承就不要用!!!!!!!!!

2. 继承是一种 is-a 的关系;组合是一种 has-a 的关系。

3. 优先使用组合,而不是继承。(低耦合)降低耦合度,维护性好。

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

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

相关文章

学习经验分享【30】Pycharm插件chatgpt,用来辅助编写代码

在Pycharm中发现ChatGPT插件&#xff0c;很好用&#xff0c;免费安全&#xff0c;大家可以作为编代码的辅助工作&#xff0c;也可用来玩GPT的接口。具体方法如下 实现效果如下&#xff1a; 更多精彩内容敬请持续关注。如果本博文对你有帮助的话&#xff0c;欢迎点赞、评论区留言…

BUUCTF-一叶障目 解析

打开文件发现一张png图片&#xff0c;里面没有内容&#xff0c;使用tweakpng打开 tweakpng报错 &#xff0c;说明crc校验值对不上 有两种可能&#xff0c;一是crc值被修改&#xff0c;二是图片的宽高被修改&#xff08;在ctf中多半是后者&#xff09; 先尝试修改crc值为55900…

【王道·计算机网络】第五章 传输层

一、传输层概述 传输层为应用层提供通信服务&#xff0c;使用网络层服务传输层的功能&#xff1a; 提供进程和进程之间的逻辑通信&#xff08;网络层提供主机之间的逻辑通信&#xff09;复用&#xff08;发送发不同的应用进程&#xff09;和分用&#xff08;接收方正确的数据传…

【网络协议详解】——PPP协议(学习笔记)

目录 &#x1f552; 1. 数据链路层协议概述&#x1f552; 2. PPP协议分析&#x1f558; 2.1 概述&#x1f558; 2.2 工作流程&#x1f558; 2.3 帧格式 &#x1f552; 3. LCP协议&#x1f558; 3.1 概述&#x1f558; 3.2 报文格式&#x1f558; 3.3 报文种类&#x1f564; 3.3…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;公司需要招聘一位自动化测试工程师&#xff0c;我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式…

STM32F407+LWIP+DP83848以太网驱动移植

最近有个项目上需要用到网络功能&#xff0c;于是开始移植网络相关代码。在移植的过程中感觉好难&#xff0c;网上找各种资料都没有和自己项目符合的&#xff0c;移植废了废了好的大劲。不过现在回头看看&#xff0c;其实移植很简单&#xff0c;主要是当时刚开始接触网络&#…

【数据分享】2020年我国地级市医疗资源空间分布数据(Shp格式/Excel格式)

医疗资源的配置情况直接反映了一个城市的发展水平&#xff0c;医疗资源相关数据也是经常使用到的数据&#xff01; 我们发现学者刘海猛在科学数据银行&#xff08;ScienceDB&#xff09;平台上分享了2020年我国341个城市&#xff08;地区、州、盟&#xff09;的基础医疗资源数…

电脑安装软件时,如何避免捆绑安装?

在网络上非正规网站下载安装软件时&#xff0c;经常会遇到捆绑安装的情况。你明明下载了一个软件&#xff0c;电脑上却多出好几个。那么我们在安装软件时&#xff0c;如何才能避免捆绑安装呢&#xff1f; 什么是捆绑安装&#xff1f; 捆绑安装是指用户安装一个软件时&#xff…

Spring boot框架 JWT实现用户账户密码登录验证

目录 1、JWT定义 1、1 JWT工作流程 1、2 JWT优点 2、添加依赖项到pom.xml 3、创建用户实体类 4、实现认证服务 5、登录请求处理 6、生成JWT 1、JWT定义 JWT&#xff08;JSON Web Token&#xff09;是一种用于在网络应用间传递信息的安全传输方式。它是一种紧凑且自包含…

tolua源码分析(五)lua使用C#的enum

tolua源码分析&#xff08;五&#xff09;lua使用C#的enum 上一节我们讨论了C#类是如何注册到lua的过程&#xff0c;以及lua调用C#函数时底层所做的事情。在此基础之上&#xff0c;本节我们来看看C#的enum是如何注册到lua的&#xff0c;它和一般类的注册有哪些区别。 老规矩&a…

互联网医院资质代办|互联网医院牌照的申请流程

随着互联网技术的不断发展&#xff0c;互联网医疗已经逐渐成为人们关注的热点话题。而互联网医院作为互联网医疗的一种重要形式&#xff0c;也越来越受到社会各界的关注。若想开展互联网医院业务&#xff0c;则需要具备互联网医院牌照。那么互联网医院牌照的申请流程和需要的资…

算法——归并排序和计数排序

Ⅰ. 归并排序 1. 基本思想 归并排序&#xff08; MERGE-SORT &#xff09;是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法&#xff08; Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;…

Python爬虫| 一文掌握XPath

本文概要 本篇文章主要介绍利用Python爬虫爬取付费文章&#xff0c;适合练习爬虫基础同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&…

公司来了个00后,我愿称之为卷王之王,卷的让人崩溃...

前几天我们公司一下子来了几个新人&#xff0c;看样子好像都是一些00后&#xff0c;这些年轻人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算下班走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好提前走。 2023年春招已经过去了&#xff0…

网络安全前景怎么样?怎么自学?看这一篇就够了

一、网络安全前景 网络安全行业细分岗位比较多&#xff0c;目前需求量比较大的几类网络安全岗位有渗透测试、安全运维、等保测评等&#xff0c;在岗位需求量和薪资待遇方面都比较可观。 这时很多人就会问&#xff0c;网络安全人才需求量这么大&#xff0c;进入行业的人就会越来…

【redis】案例--迷你版微信抢红包

系列文章目录 文章目录 系列文章目录前言在这里插入图片描述 一、业务描述二、需求分析三、架构设计关键点拆红包算法 二倍均值算法 图解 四、编码实现 RedPackageController整体思路&#xff1a;发红包代码进入拆分红包算法抢红包代码 五、多学一手 前言 一、业务描述 二、需求…

鲁棒优化入门(四)——超详细讲解:两阶段鲁棒优化以及列与约束生成算法(CCG)的matlab+yalmip代码实现

本文的主要参考文献&#xff1a; Zeng B , Zhao L . Solving Two-stage Robust Optimization Problems by A Constraint-and-Column Generation Method[J]. Operations Research Letters, 2013, 41(5):457-461. 1.两阶段鲁棒优化问题的引入 鲁棒优化是应对数据不确定性的一种优…

从零玩转设计模式之单例模式-danlimos

title: 从零玩转设计模式之单例模式 date: 2022-12-12 12:41:03.604 updated: 2022-12-23 15:35:29.0 url: https://www.yby6.com/archives/danlimos categories: - 单例模式 - 设计模式 tags: - Java模式 - 单例模式 - 设计模式 前言 单例设计模式是23种设计模式中最常用的设…

面试题背麻了,花3个月面过华为测开岗,拿个26K不过分吧?

计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在一家初创…

基于 ZYNQ 的电能质量系统高速数据采集系统设计

随着电网中非线性负荷用户的不断增加 &#xff0c; 电能质量问题日益严重 。 高精度数据采集系统能够为电能质 量分析提供准确的数据支持 &#xff0c; 是解决电能质量问题的关键依据 。 通过对比现有高速采集系统的设计方案 &#xff0c; 主 控电路多以 ARM 微控制器搭配…