虚继承 -- 解决菱形继承问题以及无法跨继承访问

目录

什么是菱形继承?

菱形继承造成的问题: 

如何解决这种问题:  

代码分析: 

注意:  

什么是菱形继承?

上图就是一个菱形继承的例子。 

菱形继承:    有两个类(Father,Mother),都继承于一个类(Human),然后还有一个类,又同时继承于这两个类(Son),这样就构成了菱形继承。

菱形继承造成的问题: 

1.  会导致继承于Human类中的属性形成二义性,因为Father类从Human中继承了name和age,Mother类也从Human中继承了name和age,子类Son同时继承了父类和母类的name和age。所以在子类中直接访问name和age,编译器就不知道访问的是哪个类继承来的name和age(二义性

访问就会报错 ->  属性不明确。 

如何解决这种问题:  

菱形继承中,必然会存在不明确的属性,和多继承中有所不同(因为多继承中有时可以避免)。为了能够方便写代码(直接访问name和age),我们可以使用虚继承来解决。  

class Human {
public:Human();Human(const string& name, int age);
protected:string name;int age;
};class Father : virtual public Human {
public:Father();Father(const string& name, int age);
};class Mother : virtual public Human {
public:Mother();Mother(const string& name, int age);
};class Son : public Father, public Mother {
public: Son(const string& name, int age);
};int main(void) {system("pause");return 0;
}Human::Human()
{
}Human::Human(const string& name, int age)
{this->name = name;this->age = age;
}Father::Father()
{
}Father::Father(const string& name, int age):Human(name,age)
{
}Mother::Mother()
{
}Mother::Mother(const string& name, int age):Human(name,age)
{
}Son::Son(const string& name, int age)
{this->name = name;this->age = age;
}

代码分析: 

1.  我们在Father和Mother类继承前加上了virtual关键字,这样在Son的构造函数中就可以直接访问name和age了,因为虚继承之后,编译器认为name和age既不来自于Father,也不来自于Mother,而是直接访问的Human类中的,这样就不会有二义性了。

2.   那么共同的祖先就被称为虚基类(此处的Human)

3.  实现虚继承后,我们在初始化继承来的name和age属性的时候,也可以直接调用Human的构造函数。 

 这样也是可以的。 

注意: 

1.  虽然多继承中也有可能存在二义性,但是是不能使用虚继承来解决的。(仔细对比就知道,菱形继承存在三层继承关系,多继承一般就两层) 

2.  只有在实现虚继承的时候,子类才能调用父类的父类的(也就是Son调用Human)类中的属性和方法,其它情况,子类最多只能访问父类的。  (父类的父类等等,是不能访问的) 

 Huamn类中的test()方法,在没有实现虚继承的情况下,也会报错->不明确,因为这个方法,Father类和Mother类中也继承了。

不使用虚继承,直接使用Human类的构造方法,也是会报错的。 

3.  所以,多层继承中,子类最多只能访问到上一层。(在没有实现虚继承的情况下) 

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

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

相关文章

CentOS 7安装Nodejs

说明:本文介绍如何在云服务器上CentOS 7操作系统上安装Nodejs。以及安装过程中遇到的问题。 下载压缩包&解压 首先,先去官网下载Linux版本的Node。 将下载下来的压缩包,上传到云服务器上,解压。配置环境变量。 &#xff08…

保护我方水晶,2024 数据库安全工具盘点

在数据价值堪比石油的数字时代,对每个组织而言,保护这一核心资产显得尤为重要。无论是来自外部的黑客攻击和恶意软件,还是源于内部的人为失误和内鬼行为,威胁无处不在。本文将介绍几款先进的数据库安全工具,从不同维度…

统一数据格式返回,统一异常处理

目录 1.统一数据格式返回 2.统一异常处理 3.接口返回String类型问题 1.统一数据格式返回 添加ControllerAdvice注解实现ResponseBodyAdvice接口重写supports方法,beforeBodyWrite方法 /*** 统一数据格式返回的保底类 对于一些非对象的数据的再统一 即非对象的封…

FastDFS安装并整合Openresty

FastDFS安装 一、环境--centos7二、FastDFS--tracker安装2.1.下载2.2.FastDFS安装环境2.3.安装FastDFS依赖libevent库2.4.安装libfastcommon2.5.安装 libserverframe 网络框架2.6.tracker编译安装2.7.文件安装位置介绍2.8.错误处理2.9.配置FastDFS跟踪器(Tracker)2.10.启动2.11…

【MySQL进阶之路】BufferPool 生产环境优化经验

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

【开源】基于JAVA+Vue+SpringBoot的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

你的立身之本是什么?

去年发生的一切,大到疫情、政治经济形势、行业的萎靡和震荡,小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们: 当冲击到来的时候,它是不会提前跟你打招呼的。 接下来的10年,我们所面临的不确定性,比起…

Python春节倒计时:用代码迎接新年的到来!

使用Python实现春节倒计时程序 一、引言 随着科技的不断发展,编程已经渗透到我们生活的方方面面。今天,我们将使用Python编写一个春节倒计时程序,来感受编程与传统文化的巧妙结合。该程序将能够显示距离农历2024年春节(大年初一…

2009-2019年地级市分类转移支付数据

2009-2019年地级市分类转移支付数据 1、时间:2009-2019年 2、来源:整理自wind 3、指标:公共财政收入:返还性收入、公共财政收入:一般性转移支付收入、公共财政收入:专项转移支付收入 4、范围:280个地级市 5、指标解释&#x…

Git版本与分支

目录 一、Git 二、配置SSH 1.什么是SSH Key 2.配置SSH Key 三、分支 1.为什么要使用分支 2.四个环境及特点 3.实践操作 1.创建分支 2.查看分支 3.切换分支 4.合并分支 5.删除分支 6.重命名分支 7.推送远程分支 8.拉取远程分支 9.克隆指定分支 四、版本 1.什…

免费搭建幻兽帕鲁服务器,白嫖阿里云游戏服务器

阿里云幻兽帕鲁服务器免费搭建方案,先在阿里云高校计划「云工开物」活动领取学生专享300元无门槛代金券,幻兽帕鲁专用服务器4核16G配置26元1个月、149元半年,直接使用这个无门槛300元代金券抵扣即可免费搭建幻兽帕鲁服务器。阿里云服务器网al…

Vulnhub靶机:hacksudo-Thor

一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo-Thor(10.0.2.49) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.com/…