虚基类及虚基类的定义使用
虚基类
在前面学过的继承过程中,不知道大家有没有想到这种情况:在多继承关系中,如果一个派生类的从两个父类那里继承过来,并且这两个父类又恰恰是从一个基类那里继承而来。那这样就麻烦了,因为你可能继承了两份一样的成员!
这就出现了所谓二义性问题,下面我们展开学习:
先给大家举一个能说明这种多继承的例子吧,笔者我想来想去,想了这么一个例子:以前呢有一个大户人家,起初呢就两口子,男主人掌权,保管着大门钥匙,后来他们有两个儿子,若干年后长大成人,男主人也老了,就把钥匙又配了两把,分别交给他的两个儿子,交由他们主持家业,又过去好多年,两个儿子也都成了家,又分别有一男一女,也就是家里的孙子孙女,传宗接代。所谓人丁兴旺吖,后来他们也长大成人,又到了交接钥匙的时候,古代当然钥匙要传给男孩啦,那么这个时候,当然给孙子啦,这个时候呢孙子的爹和他的叔伯(也就是最初主人的俩儿子)都要配一个钥匙给这个孙子,他手上就有了两把。小孙子看着手里两把钥匙,说:“一把就够!两把…这不浪费嘛!”
看完这个故事,大家就好理解多继承了,故事中最初的男主人,也就是爷爷,就是基类,他的两个孩子,是两个派生类,然后其中一个人的孩子,就是那个小孙子,就是最后的派生类,由于他继承自两个派生类。且这两个派生类都有一个共同的成员(钥匙,因为都继承同一个基类--爷爷)。最后的小孙子的派生类有两个重复的成员(钥匙),就是二义性的根源所在!
下面,我们按照这个例子,具体成代码,大家可以参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
代码就是刚才故事的一个表现,为了方便形容,定义的四个类都很空,重点看继承关系即可。即Grandson类继承两个father类,会有两个key成员,这个时候如果试图使用这个key,注意已经声明为public类型,在主函数中试图赋值时候,会有“不唯一、模棱两可”的错误提示,即所谓的二义性问题发生。大家可以好好体会。
那么如何规避这个问题呢?即使用虚基类!
所谓虚基类就是在继承的时候在继承类型public之前用virtual修饰一下 。比如还是这个例子,只需要父亲类在继承爷爷类的时候多加一个virtual,那么这个时候,派生类和基类就只维护一份一个基类对象。避免多次拷贝,出现歧义。银行从业考试大纲
定义方法即在两个父亲类的派生时增加virtual的声明:
class Father1:virtual public Grandfather
class Father2:virtual public Grandfather
其余不变,大家可以自行上机测试,理解二义性的产生及虚基类的用法。
虚基类及虚基类的定义使用相关推荐
- 抽象类(纯虚函数、虚函数)和虚基类(虚继承)
C++多态 C++的多态包括静态多态和动态多态,静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态实在编译期间就能确定,动态多态实直在程序运行时才能确定. 抽象类 虚函数 在默认情况下对函数 ...
- C++ - 虚基类、虚函数与纯虚函数
虚基类 在说明其作用前先看一段代码 class A { public: int iValue; }; class B:public A { public: void bPri ...
- 虚函数、纯虚函数、虚基类、抽象类、虚函数继承、虚继承
虚函数:虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.是C++中多态性的一个重要体现,利用基类指针访问派生类中的成员 ...
- 基类、派生类、虚基类、虚函数、虚析构、纯虚函数、抽象类
基类:被其它类通过继承方式作为父类继承的类称为基类:描述派生类的统一种类的方式. 派生类:通过继承其他类(并可能含有自定义成员)实现的子类:为提高代码的重用性及与同样继承于同一个父类的其它类形成统一种 ...
- 深剖基类和派生类的虚函数表
1.当派生类实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数地址不同: 当派生类不实现基类的虚函数时,基类中虚函数表和虚函数地址和派生类中虚函数表和虚函数的地址相同. 1.派生 ...
- 【虚基类、虚函数及应用】
虚基类 1.虚基类存在的意义 当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类 ...
- c++ 基类和派生类的虚函数表是否为同一个
总结 派生类实现基类的虚函数时,基类中虚函数表和派生类的虚函数表地址不同,基类虚函数表中的虚函数地址和派生类虚函数表中的虚函数地址不同: 派生类不实现基类的虚函数时,基类中虚函数表和派生类中虚函数表地 ...
- 设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数、求正方形周长的虚函数、输出函数。 (2) 定义类Square的共有派
设计一个程序,求正方形和长方形的周长,具体要求如下: (1) 定义正方形类Square作为基类,包含数据成员边长,以及构造函数.求正方形周长的虚函数.输出函数. (2) 定义类Square的共有派生类 ...
- cnbloger: 北岛知寒, C++ - 虚基类、虚函数与纯虚函数; csdner: Hsuxu, C++虚基类的实现机制
If the author of the article is not allowed to reprint, this article will be deleted C++ - 虚基类.虚函数与纯 ...
- C++虚继承中的虚基类表
虚继承主要解决多重继承会在子类中存在多份拷贝的问题,这不仅浪费空间,而且存在二义性. 在之前的 C++ 继承中已经说过虚继承基本概念,这里不再赘述.这篇文章主要探究虚继承的原理.文章中多处给出了类实例 ...
最新文章
- qt 找不到 -lpulse-mainloop-glib,找不到 -lpulse问题
- docx.opc.exceptions.PackageNotFoundError: Package not found at ‘文件名.docx‘ 问题解决
- chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图
- :new与:old的用法
- php mysql_query的的用法_PHPmysqli_query()函数定义与用法
- DocumentHelper和SAXReader解析XML字符串
- Qt笔记-获取Windows下目前运行的进程信息
- 2 HTML中的body和它的默认样式
- 6月3号=》66页-70页
- 【版本控制】如何从github 上获取源码
- creo数控编程怎么样_CREO数控编程NC图文教程 -
- 四川大学计算机考研信息汇总
- 用eclipse和androidstudio和基于高德地图API开发的附近购平台的java服务端和android客户端数据库用mysql包括程序设计图
- 关于将Ubuntu下中文目录修改为英文的解决方案
- 解决CUDA error: no kernel image is available for execution on the device
- python电脑推荐_kk视频app下载安装|腾讯视频app下载_电脑知识学习网
- matlab用eval函数,matlab—eval函数
- 提取百度新闻的标题、网址、日期和来源
- 手机操作系统开源软件
- 2021中国大数据50强震撼揭晓 智领云再度荣登榜单!