【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 )

文章目录

  • 一、继承的二义性
    • 1、场景说明 - 继承的二义性
    • 2、继承中的二义性报错
    • 3、完整代码示例
  • 二、virtual 虚继承
    • 1、虚继承引入
    • 2、虚继承语法
    • 3、代码示例 - 虚继承





一、继承的二义性




1、场景说明 - 继承的二义性


A 类 是 父类 ,

B 类 和 C 类 继承 A 类 , 是 子类 ,

D 类 多继承 B 类 和 C 类 , 是 孙子类 ;


在这里插入图片描述

假如 A 类中有 成员变量 x ,

则 子类 B 类 和 C 类 都会继承该 成员变量 x ,

D 类 多继承 B 类 和 C 类 , 会 分别从 B 和 C 各自 继承一个 成员变量 x ;

D 类中 , 从 B , C 两个父类中继承自 爷爷类 A 的成员变量 , 会出现二义性 ;


代码如下 :

#include "iostream"
using namespace std;

class A {
public:
	int x;
};

// 子类 B 继承了父类 A 的 x 成员
class B : public A {
public:
	int y;
};

// 子类 C 继承了父类 A 的 x 成员
class C : public A {
public:
	int z;
};

// D 多继承 B 和 C 
// 分别从 B 和 C 各自继承一个来自 A 的成员 x
class D : public B, public C {
public:
	int k;
};

2、继承中的二义性报错


如果强行使用 对象.x 访问继承自 A , 会报错 error C2385: 对“x”的访问不明确 ;

定义 D 类的对象 d , 如果访问 继承自 A 类的 x 成员 , 则会出现二义性 ;

	// 定义 D 类对象 d
	D d;

	// 访问 继承自 A 类的 x 成员出现二义性
	// 报错 error C2385: 对“x”的访问不明确
	d.x = 40;

完整报错信息 :

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Test.cpp(41,6): error C2385: 对“x”的访问不明确
1>Test.cpp(41,6): message : 可能是“x”(位于基“A”中)
1>Test.cpp(41,6): message : 也可能是“x”(位于基“A”中)
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

3、完整代码示例



代码示例 :

#include "iostream"
using namespace std;

class A {
public:
	int x;
};

// 子类 B 继承了父类 A 的 x 成员
class B : public A {
public:
	int y;
};

// 子类 C 继承了父类 A 的 x 成员
class C : public A {
public:
	int z;
};

// D 多继承 B 和 C 
// 分别从 B 和 C 各自继承一个来自 A 的成员 x
class D : public B, public C {
public:
	int k;
};

int main() {

	// 定义 D 类对象 d
	D d;

	// 访问继承自 B 类的 y 成员
	d.y = 10;
	// 访问继承自 C 类的 z 成员
	d.z = 20;
	// 访问 D 类自己的成员 k
	d.k = 30;

	// 访问 继承自 A 类的 x 成员出现二义性
	// 报错 error C2385: 对“x”的访问不明确
	//d.x = 40;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

在这里插入图片描述





二、virtual 虚继承




1、虚继承引入


在多继承中 , 如果一个类继承了多个含有相同基类的派生类 , 就会产生菱形继承结构 ;

这种情况下 , 可能会出现多个不同的基类实例 , 导致重复定义和二义性 ;

为了应对上述 继承的二义性 问题 ,

C++ 语言 使用 " 虚继承 " 解决 继承中的 二义性问题 ;


C++ 中的 " 虚继承 " 是一种解决 多继承 带来的 菱形问题(diamond problem)的技术 ;

虚继承的目的是 确保每个基类只被继承一次 , 从而避免 重复定义 和 二义性等问题 ;


虚继承 通过在 派生类 中使用关键字 virtual 来指示基类应该被虚继承 , 虚继承确保了每个基类只被继承一次 , 从而避免了重复定义和二义性 ;

在 C++ 中,使用虚继承的语法是在基类列表中使用 virtual 关键字 ;


2、虚继承语法


虚继承语法 : 在 继承的 访问限定符 之前 , 添加 virtual 关键字 , 将该继承行为定义为 " 虚继承 " ;

class 子类类名 : virtual 访问限定符 父类类名
{
	// 子类内容
}

下面的 B 类 和 C 类 , 就是 虚继承 类 A ;

class A {
public:
	int x;
};

// 子类 B 继承了父类 A 的 x 成员
class B : virtual public A {
public:
	int y;
};

// 子类 C 继承了父类 A 的 x 成员
class C : virtual public A {
public:
	int z;
};

3、代码示例 - 虚继承


代码示例 :

#include "iostream"
using namespace std;

class A {
public:
	int x;
};

// 子类 B 继承了父类 A 的 x 成员
class B : virtual public A {
public:
	int y;
};

// 子类 C 继承了父类 A 的 x 成员
class C : virtual public A {
public:
	int z;
};

// D 多继承 B 和 C 
// 分别从 B 和 C 各自继承一个来自 A 的成员 x
class D : public B, public C {
public:
	int k;
};

int main() {

	// 定义 D 类对象 d
	D d;

	// 访问继承自 B 类的 y 成员
	d.y = 10;
	// 访问继承自 C 类的 z 成员
	d.z = 20;
	// 访问 D 类自己的成员 k
	d.k = 30;

	// 访问 继承自 A 类的 x 成员出现二义性
	// 报错 error C2385: 对“x”的访问不明确
	// 使用 virtual 虚继承后 , 不会报错
	d.x = 40;
	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

在这里插入图片描述

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

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

相关文章

如何在Puppeteer中设置User-Agent来绕过京东的反爬虫机制?

概述 京东作为中国最大的电商平台,为了保护其网站数据的安全性,采取了一系列的反爬虫机制。然而,作为开发者,我们可能需要使用爬虫工具来获取京东的数据。 正文 Puppeteer 是一个由 Google 开发的 Node.js 库,它提供…

SpringCloud 微服务全栈体系(四)

第六章 Nacos 配置管理 Nacos 除了可以做注册中心,同样可以做配置管理来使用。 一、统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案…

【数据结构】— —邻接矩阵和邻接表存储图结构

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

XTU-OJ 1227-Robot

题目描述 假设在一个XOY坐标的平面上,机器人一开始位于原点,面向Y轴正方向。 机器人可以执行向左转,向右转,向后转,前进四个指令。 指令为 LEFT:向左转RIGHT:向右转BACK:向后转FORWORD n:向前走n(1≤n≤100)个单位 现在…

10月最新H5自适应樱花导航网站源码SEO增强版

10月最新H5自适应樱花导航网源码SEO增强版。非常强大的导航网站亮点就是对SEO优化比较好。 开发时PHP版本:7.3开发时MySQL版本:5.7.26 懂前端和PHP技术想更改前端页面的可以看:网站的前端页面不好看,你可以查看index目录&#x…

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符:&& , || , !4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习:闰年的判断4.5 短路 5. swit…

react笔记基础部分(组件生命周期路由)

注意点&#xff1a; class是一个关键字&#xff0c; 类。 所以react 写class, 用classname &#xff0c;会自动编译替换class 点击方法&#xff1a; <button onClick {this.sendData}>给父元素传值</button>常用的插件&#xff1a; 需要引入才能使用的&#xf…

Linux msend.pl配置

1.概述 1.1.说明​​​​​ 本文细描述Linux环境下(arm架构x64)基于perl的msend.pl配置,以实现根据msend.pl进行告警事件的发送。 1.2.环境说明 OS Version:RHEL7.6(arm架构x64) Perl Version: v5.16.3 1.3.msend.pl架构图 2.msend.pl配置 2.1.msend.pl配置 前提:以r…

小学数学作业练习册出题网站源码_支持打印转成PDF

小学数学作业练习册出题网站源码_支持打印转成PDF 小学数学出题网页版源码&#xff0c;加减乘除混合运算&#xff0c;支持自定义数字、小数、混合运算&#xff0c;支持加减乘除运算混合多选&#xff08;一道题中同时随机出现加减乘除运算符&#xff09;支持自定义出题数量&…

三、W5100S/W5500+RP2040树莓派Pico<TCP Client数据回环测试>

文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. TCP Client数据回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 在当今的计算机网络环境中&#xff0c;TCP&#xff08;传输控制协议&am…

R语言代码示例

以下是一个使用R语言和httrOAuth库的下载器程序&#xff0c;用于下载的内容。程序使用以下代码。 # 安装和加载必要的库 install.packages("httr") install.packages("httrOAuth") library(httr) library(httrOAuth) ​ # 设置 http_proxy <- "du…

软件测试面试1000问(含文档)

前前后后面试了有20多家的公司吧&#xff0c;最近抽空把当时的录音整理了下&#xff0c;然后给大家分享下 开头都是差不多&#xff0c;就让做一个自我介绍&#xff0c;这个不用再给大家普及了吧 同时&#xff0c;我也准备了一份软件测试视频教程&#xff08;含接口、自动化、…

XTU-OJ 1178-Rectangle

题目描述 给你两个平行于坐标轴的矩形&#xff0c;请判断两者是不是相交&#xff08;面积有重合的部分&#xff09;&#xff1f; 输入 第一行是一个整数K&#xff0c;表示样例数。 每个样例占两行&#xff0c;每行是4个整数&#xff0c;表示一个矩形的对角线点的坐标&#xff0…

蓝桥杯双周赛算法心得——铺地板(质因数)

大家好&#xff0c;我是晴天学长&#xff0c;这是第二周的蓝桥杯的双周赛&#xff0c;题可出的又好又灵活啊&#xff01;真不错&#xff01; 1) .铺地板 2) .算法思路 1.导入java.util包中的Scanner类&#xff0c;以从用户那里读取输入。 2.main方法是程序的入口点。 3.创建一…

MYSQL(事务+锁+MVCC+SQL执行流程)理解

一)事务的特性: 一致性:主要是在数据层面来说&#xff0c;不能说执行扣减库存的操作的时候用户订单数据却没有生成 原子性:主要是在操作层面来说&#xff0c;要么操作完成&#xff0c;要么操作全部回滚&#xff1b; 隔离性:是自己的事务操作自己的数据&#xff0c;不会受到到其…

sheng的学习笔记-【中】【吴恩达课后测验】Course 3 - 结构化机器学习项目 - 第一周测验

课程3_第1周_测验题 目录&#xff1a;目录 要解决的问题 ① 这个例子来源于实际项目&#xff0c;但是为了保护机密性&#xff0c;我们会对细节进行保护。 ② 现在你是和平之城的著名研究员&#xff0c;和平之城的人有一个共同的特点&#xff1a;他们害怕鸟类。 ③ 为了保护…

超级强大!送你几款Linux 下终极SSH客户端

更多IT技术&#xff0c;请关注微信公众号:“运维之美” 超级强大&#xff01;送你几款Linux 下终极SSH客户端 1.MobaXterm2.Xshell3.SecureCRT4.PuTTY5.FinalShell6.Termius7.WindTerm 安全外壳协议&#xff08;Secure Shell&#xff0c;简称 SSH&#xff09;是一种网络连接协议…

线性代数1:线性方程和系统

Digital Collection (staedelmuseum.de) 图片来自施泰德博物馆 一、前言 通过这些文章&#xff0c;我希望巩固我对这些基本概念的理解&#xff0c;同时如果可能的话&#xff0c;通过我希望成为一种基于直觉的数学学习方法为其他人提供额外的清晰度。如果有任何错误或机会需要我…

【Overload游戏引擎细节分析】standard材质Shader

提示&#xff1a;Shader属于GPU编程&#xff0c;难写难调试&#xff0c;阅读本文需有一定的OpenGL基础&#xff0c;可以写简单的Shader&#xff0c;不适合不会OpenGL的朋友 一、Blinn-Phong光照模型 Blinn-Phong光照模型&#xff0c;又称为Blinn-phong反射模型&#xff08;Bli…

苹果将于8月31日举行今秋的第二场发布会

在今日凌晨&#xff0c;苹果宣布&#xff0c;将于北京时间10月31日早上8点举行今秋的第二场发布会&#xff0c;主题为“来势迅猛”。据多方猜测苹果本次活动的核心产品大概率是搭载全新M3芯片的Mac系列产品。 据了解&#xff0c;在苹果的产品线中&#xff0c;搭载M3芯片的Mac系…