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

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

例:类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.mzph.cn/bicheng/17105.shtml

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

相关文章

添加AXI主IP(AXI4 Lite和AXI4)示例

添加AXI主IP&#xff08;AXI4 Lite和AXI4&#xff09;示例 将等效IP添加到框图中。以下是AXI Central的示例步骤 直接存储器存取&#xff08;CDMA&#xff09;&#xff1a; 1.右键单击方框图中的任意位置&#xff0c;然后选择“添加IP”。 2.搜索并双击AXI Central Direct Memo…

Android 录音AudioRecord

AudioRecord是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据&#xff0c;即PCM数据&#xff0c;PCM数据不能被播放器直接播放&#xff0c;需要编码压缩成常见音频格式才能被播放器识别。通常生成PCM文件之后可将PCM文件转成WAV文件一般的播放器便可直接播放了。…

前端开发技巧 --判断文本是否溢出

const isTextOverflower()>{if(element){return element.offsetWidth > element.scrollWidth}return false}实现javascript 判断文本是否溢出

【除了知乎,大家都在逛什么?持续更新~~】

除了知乎&#xff0c;大家都在逛什么&#xff1f; 中文博客琅琊榜 https://github.com/qianguyihao/blog-list 中文博客琅琊榜&#xff0c;只收录优质的中文独立博客&#xff0c;全网最精品。已收录博客数量&#xff1a;328 个博客站点。 这些博主才华横溢&#xff0c;满怀自由…

【2024最新】软考资料大全(免费)

IT行业越来越卷&#xff0c;大家都在忙着搞证&#xff0c;你免费不搞一个&#xff1f; 不管有没有用&#xff0c;有总比没有好噻~ 【初级】&#xff0c;【中级】&#xff0c;【高级】 都有&#xff0c;而且全部免费&#xff0c;全部最新的&#xff01;真题&#xff0c;论文都…

Java查看线上对象的变量值

背影 有时候线上有些配置类&#xff0c;想查看下配置修改是否生效&#xff0c;传统的方法要通过打日志的方法&#xff0c;如果不想通过打日志的方法&#xff0c;有没有好的方案能解决这个问题呢 解决方案 arthas 步骤 得到类加载器的hashcode sc -d com.example.MyService…

眼底项目经验

眼底项目经验 可解释性不足问题眼底项目有多牛逼可解释性不足解法数据、算力、算法都免费送不仅预测当下&#xff0c;还能预测未来和慢病管理整合&#xff0c;形成一个实时健康检测生态 可解释性不足问题 今天下午和腾讯眼底项目人员讨论, 他们不准备做全身性的多疾种, 因为深…

LINUX环境基础练习题(附带答案)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【typescript - tsc 编译后路径问题/路径别名问题】

这几天在写typescript&#xff0c;遇到个路径依赖问题&#xff0c;编写的.ts文件直接运行OK&#xff0c;但是编译成.js后&#xff0c;运行提示 Error: Cannot find module xxx&#xff0c;&#x1f4dd;记录分析和解决过程 。 问题描述 原始文件&#xff0c;有index.ts 其会引…

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…

4 CSS的 变换、过渡与动画

CSS3引入了变换、过渡和动画特性&#xff0c;使得网页可以呈现出丰富的视觉效果和交互体验。通过这些新特性&#xff0c;开发者可以创建复杂的动画效果&#xff0c;而不需要使用JavaScript。 4.1 变换&#xff08;Transforms&#xff09; 变换允许开发者对元素进行旋转、缩放…

Python考试复习--day2

1.出租车计费 mile,waitmap(int,input().split(,)) if mile<3:money13wait*1 elif mile>3 and mile<15:money13(mile-3)*2.3wait*1 else:money1312*2.3(mile-15)*2.3*(10.5)wait*1 print({:.0f}.format(money)) 【知识点1】&#xff1a; map() 函数 【知识点1】&…

代码随想录算法训练营第五十一天|300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

300.最长递增子序列 dp数组的含义为dp[i]表示字符串以第i位置为末尾的最长递增子序列的长度。 for (int i 1; i < nums.size(); i) {for (int j 0; j < i; j) {if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1);}if (dp[i] > result) result dp[i]; // 取…

设计模式 20 中介者模式 Mediator Pattern

设计模式 20 中介者模式 Mediator Pattern 1.定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装对象之间的交互&#xff0c;促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象&#xff0c;将系统中对象之间…

Vue中,点击提交按钮,路由多了个问号

问题 当点击提交按钮是路由多了问号&#xff1a; http://localhost:8100/#/ 变为 http://localhost:8100/?#/原因 路由中出现问号通常是由于某些路径或参数处理不当造成的。在该情况下&#xff0c;是因为表单的默认行为导致的。提交表单时&#xff0c;如果没有阻止表单的默…

React Router v6:路由管理的最新进展

React Router v6 是 React 应用程序路由管理的一个重大更新&#xff0c;它引入了许多改进和简化&#xff0c;包括对嵌套路由的更友好处理&#xff0c;以及对钩子函数的使用。 2500G计算机入门到高级架构师开发资料超级大礼包免费送&#xff01; 1. Routes 重构 在 v6 中&…

Kubernetes数据存储

1. 数据存储 容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;kubernetes引入了Volume的概念。 Volu…

HTML-JavaWeb

目录 1.标题排版 2.标题样式 ​编辑 ​编辑 小结 3.超链接 4.正文排版 ​编辑​编辑​编辑5.正文布局 6.表格标签 7.表单标签 8.表单项标签 1.标题排版 ● 图片标签 :< img> src:指定图像的ur1(绝对路径/相对路径) width:图像的宽度(像素/相对于父元素的百…

【AD21】文件的整理

当所有文件输出完成后&#xff0c;需要对不同的文件去做一个整理&#xff0c;方便后续工作的交接。 在项目工程文件夹下新建名称为BOM、SMT、PRJ、Gerber和DOC的文件夹。 BOM文件夹存放BOM表发给采购人员。SMT文件夹存放装配图文件和坐标文件发给贴片厂。PRJ文件夹存放工程文件…

C++基础:多态

多态相关 多态继承重写父类的虚函数多态的体现,父类的引用指向子类对象的空间虚函数可以实现,也可以不实现,不实现必须要有初始值存在未定义的虚函数的类为抽象类.抽象类不能实例化对象;(animal父类不能实例化对象)如果父类中的函数非虚函数,则会调用父类中的函数//多态的体现…