进阶了解C++(2)——复杂的继承及其底层原理

       在上篇文章中,给出了关于继承这部分的相关知识,例如继承的定义,继承与默认成员函数等。本文将针对复杂的继承方式,

1. 复杂的继承方式:

1.1 单继承:

class Professor
{
public:
	int _age;
	string _name;
};

class Teacher : public Professor
{

public:
	int _tele;
};

class Student : public Teacher
{
public:
	
	int _weight;
};

对于上面给出的代码,如果适用图形来表示这三个类之间的结构,具体如下:

对于这种一个子类只有一个直接父类时,称这种继承关系为单继承。

1.2 多继承: 

class Professor
{
public:
	int _age;
	string _name;
};

class Teacher 
{

public:
	int _tele;
};

class Student : public Professor, public Teacher
{
public:
	
	int _weight;
};

对于上面给出代码,可以用下面的图形来表示这几个类的继承关系:

对于这种一个子类有两个或者两个以上的直接父类的关系,叫做多继承。

在多继承中,存在着一种特殊的继承关系:菱形继承,例如下面给出的代码:

class Person
{
public:
	int _ads;

};

class Professor : public Person
{
public:
	int _age;
	string _name;
};

class Teacher : public Person
{

public:
	int _tele;
};

class Student : public Professor, public Teacher
{
public:
	
	int _weight;
};

其结构可由下图表示:

        对于菱形继承,其存在着一个问题,即数据冗余和二义性。这是因为在父类Person中,声明了成员变量_ads

        对于ProfessorTeacher这两个类中分别继承了Person。对于Student,分别继承了Professor,Teacher。因此,在Student中,存在着两个相同的成员变量_ads。对于这点,也可以在监视窗口进行查看:

由于存在着两个相同的成员变量,因此造成了数据冗余。至于二义性。则体现在对于这个成员变量进行访问时所体现,例如:

通过上面给出的图片可以看出,此时编译器并不知道,需要访问的变量_ads是从哪个父类继承而来的,因此造成了二义性。但是,可以通过显式访问的方法来解决二义性问题,即:

int main()
{
	Student s;
	s.Professor::_ads = 10;
	s.Teacher::_ads = 15;
	return 0;
}

不过,这种方式只能解决二义性问题,不能解决数据冗余问题。

为了解决数据冗余的问题,需要引入虚继承,具体操作如下:

class Person
{
public:
	int _ads;

};

class Professor : virtual public Person
{
protected:
	int _age;
	string _name;
};

class Teacher1 : virtual public Person
{
 protected:
	int _tele;
};

class Student : public Professor ,public Teacher
{
public:
	
	int _weight;
};

对于虚继承的使用原则,下面给出一个例子用于说明:

       假设上图给出的结构代表一个继承体系,根据上面对与数据冗余和二义性的介绍,上图中,在E中存在两个A类继承过来的内容从而造成数据冗余。在使用虚继承时,virtual造成数据冗余和二义性的源头上,例如图中,造成上述问题的源头是因为B,D分别继承了一次A。所以,在加入虚继承时,需要在B继承A以及D继承A时加上virtual

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shell变量类型和运算符

一、Shell变量类型 1、变量类型 Shell的3种变量: (1)局部变量:除了本地变量外,还有shell脚本中定义的变量。 (2)全局变量:和局部变量相对。比如环境变量就是一种全局变量。 &am…

互联设备-中继器-路由器等

网卡的主要作用 1 在发送方 把从计算机系统要发送的数据转换成能在网线上传输的bit 流 。 2 在接收方 把从网线上接收来的 bit 流重组成计算机系统可以 处理的数据 。 3 判断数据是否是发给自己的 4 发送和控制计算机系统和网线数据流 计算机的分类 1、台式机 2、小型机和服…

Unity实现帧序列

一、目的 1.想实现序列帧效果 自己使用Animation一直无法实现动画播放效果 二、参考 1. Unity序列帧动画——Sprite图片集制作UI动画_unity 序列帧动画图集-CSDN博客 结果:很好用,能实现效果 三、实操 新建Image,增加Animator组件&#x…

【C++】类和对象---友元,内部类,匿名对象详解

目录 友元 友元函数 友元类 内部类 匿名对象 ⭐友元 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 友元分为:友元函数和友元类。 ⚡友元函数 先看一个问题&#x…

C#实用开发(14)--高清晰度字体和窗体分辨率问题。

新建winform程序是,又是会感觉到字体清晰度不够高。还有一种现象就是分辨率的问题,我们平常在自己的电脑开发是用125百分比的分辨率,实际部署的工控机是100,这就会导致分辨率不一致的问题。 可以通过新建应用程序清单,…

springboot750人职匹配推荐系统

springboot750人职匹配推荐系统 获取源码——》公主号:计算机专业毕设大全

Stable Diffusion——文生图界面参数讲解与提示词使用技巧

Clip终止层数 什么是Clip CLIP(Contrastive Language-Image Pretraining)是由OpenAI于2021年开发的一种语言图像对比预训练模型。其独特之处在于,CLIP模型中的图像和文本嵌入共享相同的潜在特征空间,这使得模型能够直接在图像和文…

关于uniapp H5应用无法在触摸屏正常显示的处理办法

关于uniapp H5应用无法在触摸屏正常显示的处理办法 1、问题2、处理3、建议 1、问题 前几天, 客户反馈在安卓触摸大屏上无法正确打开web系统(uni-app vue3开发的h5 应用),有些页面显示不出内容。该应用在 pc 端和手机端都可以正常…

重看LeakCanary

LeakCanary是我很久之前看的东西了,我当时侯对它的印象就是它可以用来检测内存泄漏,具体原理就是将弱引用对象延迟个5s然后看是否被回收,如果没有被回收,那么就说明发生了内存泄漏,其他的也没有仔细地看 现在就详细地梳理一遍这个流程: 1.L…

2.23数据结构

单向循环链表 创建单向循环链表,创建节点 ,头插,按位置插入,输出,尾删,按位置删除功能 //main.c #include "loop_list.h" int main() {loop_p Hcreate_head();insert_head(H,12);insert_head(…

ChatGpt的初步认知(认知搬运工)

前言 ChatGpt火了有一段时间了,对各行各业也有了一定的渗透,当然发展过程中也做了一些安全约束,今天主要是来跟大家分享下关于chatGpt的初步认知。 一、chatGpt是什么? ChatGPT,全称聊天生成预训练转换器(英…

电子器件系列63:焊带(光伏焊带)

光伏焊带,又称涂锡焊带。光伏焊带是光伏组件的重要组成部分,属于电气连接部件,应用于光伏电池片的串联或并联,发挥导电聚电的重要作用,以提升光伏组件的输出电压和功率。光伏焊带是光伏组件焊接过程中的重要材料&#…

在Ubuntu系统下搭建TDengine集群

目录 一、Ubuntu虚拟机创建 二、系统相关配置 1、设置系统hostname 2、网络配置及IP规划 3、配置FQDN(etc/hosts) 4、服务端口设置 三、TDengine server安装 1、服务安装 2、修改配置 3、启动taosd 4、服务卸载 四、客户端安装 1、client安…

SparkSQL学习03-数据读取与存储

文章目录 1 数据的加载1.1 方式一:spark.read.format1.1.1读取json数据1.1.2 读取jdbc数据 1.2 方式二:spark.read.xxx1.2.1 读取json数据1.2.2 读取csv数据1.2.3 读取txt数据1.2.4 读取parquet数据1.2.5 读取orc数据1.2.6 读取jdbc数据 2 数据的保存2.1…

较通用web脚手架模板搭建

较通用web脚手架模板搭建 从这里开始就接触到以后写项目的思维了。 做一个web开发,那就要层次分明,要有个实现的规划,这通常也是有一个较为通用的模板的。 总的来说:不同的层次有不同的模块,每个模块有必须实现的功…

【软件测试】定位前后端bug总结+Web/APP测试分析

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Web测试中简单…

《Python 语音转换简易速速上手小册》第10章 未来趋势和发展方向(2024 最新版)

文章目录 10.1 语音技术的未来展望10.1.1 基础知识10.1.2 主要案例:语音驱动的虚拟助理案例介绍案例 Demo案例分析10.1.3 扩展案例 1:情感敏感的客服机器人案例介绍案例 Demo案例分析10.1.4 扩展案例 2:多模态智能会议系统案例介绍案例 Demo

个人博客系统测试

文章目录 一、项目介绍二、测试1. 功能测试2. 自动化测试(1)添加相关依赖(2)新建包并在报下创建测试类(3)亮点及难点 一、项目介绍 个人博客系统采用前后端分离的方法来实现,同时使用了数据库来…

cmake 项目。qt5升级 qt6 报错 error: “Qt requires a C++17 compiler 已解决

日常项目开发中。需要对qt5升级到qt6 做cmake兼容配置,在编译中发现,有c 编译环境 报错 2>C:\Qt\6.5.3\msvc2019_64\include\QtCore/qcompilerdetection.h(1226,1): fatal error C1189: #error: "Qt requires a C17 compiler, and a suitable …

目标检测卷王YOLO卷出新高度:YOLOv9问世

论文摘要:如今的深度学习方法重点关注如何设计最合适的目标函数,使得模型的预测结果能够最接近真实情况。 同时,必须设计一个适当的架构,可以帮助获取足够的信息进行预测。 现有方法忽略了一个事实,即当输入数据经过逐层特征提取和空间变换时,大量信息将会丢失。 本文将深…