多重继承引起的二义性问题和虚基类

news2024/9/20 19:52:31

多重继承容易引起的问题就是因为继承的成员同名而产生的二义性问题。

例:类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类

情况一:

class A
{
    public:
        int a;
        void display();
};
class B
{
    public:
        int a;
        void display;
};
class C:public A,public B//公用继承
{
    public:
        int b;
        void show();
};

如果在main函数中定义类C的对象c1并调用数据成员a和成员函数display

C c1;
c1.a=3;//引用c1的数据成员a
c1.dispaly();//调用c1的成员函数display

由于基类A和基类B都有数据成员a和成员函数display,编译系统无法判别要访问的是哪一个基类的成员,因此,程序编译出错。

解决方法1、用基类名来限定

c1.A::a=3;//引用c1对象中的基类A的数据成员a
c2.A::display();//引用c1的成员函数display

若派生类C中的成员函数show访问基类A的display和a,可以不必写对象名而直接写

c1.A::A=3;//引用c1对象中的基类A的数据成员a
c1.A::display();//调用c1对象中的基类A的成员函数display

不同的成员函数,只有在函数名和参数个数相同、类型相匹配的情况下才发生同名覆盖,如果只有函数名相同而参数不同,不会发生同名覆盖,而属于函数重载。

虚基类的作用:

C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。

使用虚基类发方法:

class A//声明基类A

{.........};

class B:virtual public A//声明类B是类A的公用派生类,A是B的虚基类

{......};

class C:virtual public A//声明类C是类A的公用派生类,A是C的虚基类

{......};

注意:虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。

声明虚基类的一般形式为:

class 派生类名:virtual 继承方式 基类名

经过上面的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次,也就是说,基类成员只保留一次。

二、虚基类的初始化

class A//定义基类A

{

        A(int i){}//基类构造函数,有一个参数

.......};

class B:virtual public A//A作为B的虚基类

{

        B(int n):A(n){}//类B构造函数,在初始化表中对虚基类初始化

...};

class C:virtual public A//A作为C的虚基类

{

        C(int n):A(n){}

......};//类C的构造函数,在初始化表中对虚基类初始化

class D:public B,public C//类D的构造函数,在初始化表中对所有基类初始化

{

        D(int n):A(n),B(n),C(n){}

......};

应用:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
	Person(string nam, char s, int a) {
		name = nam;
		sex = s;
		age = a;
	}
protected:
	string name;
	char sex;
	int age;
};
class Teacher :virtual public Person
{
public:
	Teacher(string nam, char s, int a, string t) :Person(nam, s, a)
	{
		title = t;
	}
protected:
	string title;
};
class Student :virtual public Person
{
public:
	Student(string nam, char s, int a, float sco) :Person(nam, s, a)
	{
		score = sco;
	}
protected:
	float score;
};
class Graduate :virtual public Teacher, public Student//Teacher和Student为直接基类
{
public:
	Graduate(string nam, char s, int a, string t, float sco, float w) :Person(nam, s, a), Teacher(nam, s, a, t), Student(nam, s, a, sco)
	{
		wage = w;
	}
	void show()
	{
		cout << "name:" << name << endl;
		cout << "age:" << age << endl;
		cout << "sex:" << sex << endl;
		cout << "title:" << title << endl;
		cout << "score:" << score << endl;
		cout << "wage:<" << wage << endl;
	}
private:
	float wage;
};
int main()
{
	Graduate grad1("yan_tong", 'f', 24, "saadistant", 99.9, 3000);
	grad1.show();

	return 0;
}

运行结果:

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

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

相关文章

基于STM32实现智能园艺系统

目录 引言环境准备智能园艺系统基础代码示例&#xff1a;实现智能园艺系统 土壤湿度传感器数据读取水泵控制温湿度传感器数据读取显示系统用户输入和设置应用场景&#xff1a;智能农业与家庭园艺问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统…

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一&#xff1a;单机部署阶段二&#xff1a;应用与数据分离部署阶段三&#xff1a;启用缓存优化阶段四&#xff1a;启用应用服务器集群阶段五&#xff1a;数据库读写分离阶段六&#xff1a;启用反向代理及CDN加速阶段七&#xff1a;启用分布式文…

AIGC 007-E4T基于编码器的域调优用于文本到图像模型的快速个性化!

AIGC 007-E4T基于编码器的域调优用于文本到图像模型的快速个性化&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文提出了一种使用领域特定编码器来快速将文本到图像模型适配到新领域的方案。这种被称为基于编码器的领域微调 (E4T) 的方法&#xff0c;专…

SAP HCM 标准程序如何定位内表赋值 ABAP DEBUG SCRIPT

Complacency is the enemy of study 学习的敌人是自己的满足。 标准内表定位代码位置!!! 不知道大家有没有尝试体会过debug标准程序,debug过程中发现SAP标准的内表不知道什么时候赋值,或者类的静态属性什么时候改变的,本文通过ABAP DEBUG SCRIPT的方式快速定位内表赋值或者类…

音视频开发—FFmpeg打开麦克风,采集音频数据

文章目录 1.使用命令行实现采集PCM数据2.使用代码实现3.播放PCM4.PCM转换为WAV 1.使用命令行实现采集PCM数据 确保你的系统有FFmpeg安装。你可以通过在终端运行ffmpeg -version来检查是否已安装。 找出你的麦克风设备名。在Linux中&#xff0c;你可以使用arecord -l命令列出所…

内存泄漏案例分享2-Fragment的内存泄漏

案例2——hprof文件显示出Fragment内存泄漏 接下来我们来看fragment内存泄漏&#xff0c;老规矩查看fields和references&#xff0c;确保它符合内存泄漏的情形&#xff1b;我们点击jump to source查看泄漏的位置 Fragment#MZBannerView#内部类Runnbale /*** Banner 切换时间间…

添加、修改和删除字典元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于字典是可变序列&#xff0c;所以可以随时在字典中添加“键-值对”。向字典中添加元素的语法格式如下&#xff1a; dictionary[key] value 参数…

有哪些永久免费的进销存管理软件?

我明白许多中小企业在寻求进销存系统时&#xff0c;希望能找到一款完全免费的解决方案&#xff0c;以减轻经济压力。这种心态非常正常&#xff0c;毕竟成本是任何企业都需要仔细考虑的因素。然而&#xff0c;我要强调的是&#xff0c;市场上那些声称“完全免费”的进销存系统&a…

【记录】初次本地搭建的模型-MiniCPM 2B

前言 查阅众多开源大模型后&#xff0c;打算动手尝试搭建端侧模型&#xff0c;看看效果。选中MiniCPM主要是因为参数小&#xff0c;同时中文支持相对较好。 首先对按照官网提供的demo进行了尝试&#xff0c;然后在colab中完成了一个webui程序并测试&#xff0c;最后通过docker环…

MySQL(二)基本SQL语句以及基本函数应用

1、基本SQL语句 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、日期/时间和字符串&#xff08;字符&#xff09;类型。 - 函数应用在sql语句中 -- 临时表 select now() from dual;-- 数…

分布式一致性必备:一文读懂Raft算法

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好!我是小米,一个热爱分享技术的29岁程序员哥哥。今天我们来聊聊分布式系统中的一个重要算法——Raft。这个算法专门用于管理分布式系统中…

学习100个Unity Shader (18) --- 几何着色器(Geometry Shader)

文章目录 概述编写格式举例应用举例&#xff08;用预制体球的每个顶点画一个立方体&#xff09;参考 概述 vertex shader --> [geometry shader] --> fragment shader。[]: 可选阶段。输入图元 —> geometry shader —> 其他图元 编写格式 [maxcertexcount(N)] …

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

百川大模型拿下国产第一,AI助手「百小应」上线,比Kimi强不少

最近几天&#xff0c;国内 AI 创业公司正在连续刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能发布最新一代基座大模型 Baichuan 4&#xff0c;同时推出了首款 AI 助手「百小应」。 相较 1 月份发布的 Baichuan 3&#xff0c;新一代模型在各项能力上均有大幅提升&am…

OrangePi AIpro评测 - 基础操作篇

0. 环境 ●OrangePi AIpro ●win10笔记本 ●路由器 准备下win10电脑、路由器&#xff0c;这些板卡通常是在网络正常的环境下才方便测试。 还要准备OrangePi AIpro的官方资料&#xff1a; http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-suppo…

牛客NC164 最长上升子序列(二)【困难 贪心+二分 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心&#xff0c;就是往死里贪&#xff0c;所以对于最大上升子序列&#xff0c;结尾元素越小&#xff0c;越有利于后面接上其他的数&#xff0c;也就可能变…

麒麟系统firewalld限制指定的ip访问指定的端口

先开放所有端口 然后第三个限制会把第四个第五个拦住 so 这个是错误案例 accecpt 接受 reject 拒绝

为什么短剧突然爆火?背后究竟谁在为流量买单?

为什么短剧突然爆火&#xff1f;背后究竟谁在为流量买单&#xff1f; 文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 今年很多朋友交流的更多的商业热门话题就是“短剧”&#xff0c;目前我国拥有超10亿的短视频用户&a…

利用ESP32(Arduino IDE)向匿名上位机发送欧拉角

文章目录 一. 匿名上位机介绍二. 匿名协议说明1. 匿名协议官方说明文档2. 协议说明 三. 向匿名上位机发送数据(基于Arduino IDE的esp32)四. 运行效果 一. 匿名上位机介绍 匿名上位机官方介绍视频 匿名上位机官方下载 二. 匿名协议说明 1. 匿名协议官方说明文档 官方对于协…

2024年短视频评论区批量爬取采集软件

一、背景说明 前言 评论区引流&#xff0c;顾名思义&#xff0c;是通过在视频下方进行留言评论、回复评论&#xff0c;吸引用户的注意&#xff0c;从而和你的账号产生互动、交易。比如&#xff0c;在一个关于健身的视频下方&#xff0c;留言分享自己的健身经验或者提出问题。…