第三十四篇日志中提到,子类对象调用父类同名的函数时需要使用作用域标识符进行限定,这是在任何继承情况下都可以使用的普适方法。

问题引入:

考虑一种特殊的情况:子类全部或部分的基类(称为中间基类)同是继承自另一个基类(称为最底层基类)此时子类含有最底层基类成员的多个副本。如果子类对象想要访问这些副本,必须通过作用域标识符指出其访问的副本来自哪个路径:

比如上图中子类Z继承自类Y1和类Y2(中间基类),同时类Y1和类Y2又均继承自X类;Y1和Y2都存在类X的成员,也就是存在两个副本。

解决方法:

如果不希望中间基类含有最底层基类X的两个副本,可以将被继承的类声明为虚基类,即在中间类声明时将最底层基类声明为虚基类。虚基类声明的语法如下:

class 

需要注意的是,virtual并不出现在子类声明中,而是针对中间基类的(即Y1和Y2)。

进行上述声明以后, 从不同路径继承得到的数据和函数成员在子类中只有一个副本子类Z的对象就可以不使用作用域标识符对最底层基类X的成员进行访问了

例子:

下面的例子中Y1和Y2中使用virtual将X声明为虚基类

class 

声明为虚基类以后,子类就仅含有一个最底层基类的成员副本,即Z只有一个X中的fun()函数和value数据的副本。此时,Z的对象就可以直接访问fun()和value了,如下:

Z 

补充:

最底层基类X需要带参数的构造函数时,中间基类Y1和Y2的构造函数需要调用X的构造函数。同时,子类Z也需要对X、Y1和Y2的构造函数进行调用。代码如下:

class 

那么,X的构造函数会被调用三次吗(Z、Y1和Y2各调用X构造函数一次)?

答案是否定的,C++中将当前对象所属的类称为最远子类并规定只有最远子类才会调用虚基类的构造函数,不会出现虚基类的构造函数被重复调用的情况。

使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...相关推荐

  1. JAVA面向对象中继承的子父类成员函数的内存图解,以及成员函数中的覆盖的应用.

    JAVA中继承子父类成员函数的使用 我把成员函数理解为就是类里面的功能,或者说是方法. 子父类的成员函数调用可以是这样的 例如: class Fu{void show1(){System.out.pr ...

  2. 成员函数指针与高性能的C++委托(三)

    委托(delegate) 和成员函数指针不同,你不难发现委托的用处.最重要的,使用委托可以很容易地实现一个Subject/Observer设计模式的改进版[GoF, p. 293].Observer( ...

  3. 第三十五章 SQL函数 CURRENT_DATE

    文章目录 第三十五章 SQL函数 CURRENT_DATE 大纲 描述 示例 第三十五章 SQL函数 CURRENT_DATE 日期/时间函数,返回当前本地日期. 大纲 CURRENT_DATE 描述 ...

  4. 类型转换函数(三十五)

    我们之前在 C 语言中讲过类型转换,那么在 C++ 中是否还会有什么新特性呢?我们先来看看之前的类型转换是怎样的,标准数据类型之间会进行隐式的类型安全转换.转换规则如下 我们还是以代码为例来进行分析 ...

  5. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  6. C++入门教程(三十五):函数类型

    小古银的官方网站(完整教程):http://www.xiaoguyin.com/ C++入门教程视频:https://www.bilibili.com/video/av20868986/ 目录 目录 ...

  7. linux使用shell函数扩充命令,Linux Shell系列教程之(十五) Shell函数简介 | Linux大学...

    摘要 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高. 高级语言都支持函数,Shell也不例外.今天就为大家介绍下Shell中函数相关用法. 函数可以将一个复杂功能划 ...

  8. python将图像转换为8位单通道_【图像处理】OpenCV系列三十五--- equalizeHist函数详解...

    上一节,我们学习了如何对两个直方图进行比较,看两幅图像的相似度是多少,经过上节的学习,相信大家对compareHist函数已经有了一个清晰的理解,本届呢,我们学习如何对一幅图像进行均衡化! 1.函数原 ...

  9. C语言试题三十五之找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。主函数中x是数组名,n 是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。

    1. 题目 请编写一个函数function,它的功能是:找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回.主函数中x是数组名,n 是x中的数据个数,max存放最大值,i ...

最新文章

  1. ssm过滤器可以只过滤html吗,SSM登陆验证之过滤器实现
  2. Delegate(QLabel和QComboBox)
  3. 请解释和、|和||的区别?
  4. 数字电路与逻辑设计笔记
  5. 【项目升级】集成Quartz.Net Job实现(一)
  6. sublimeText OmniMarkupPreviewer 404
  7. itunes未能连接到iphone_iTunes下载_苹果iTunes官方下载「32位|64位」
  8. php相应的扩展的对应链接地址
  9. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
  10. nc系统java不能用_用友NC管理系统使用过程中常见问题和解决方法!
  11. 计算机应用基础试题及答案东师,计算机应用基础试题及答案东师
  12. 600岁故宫“新政”“萌萌哒”
  13. 实现出现异常可重复执行的线程池-自定义标签(2)
  14. 清华校友走进百度 用科技赋能产业智能化转型
  15. 豌豆荚Hack Day:百宝袋负责人访谈
  16. 计算机毕业设计之SpringBoot+Vue.js+WebMagic电商数据分析 电商大数据 电商数据采集系统 电商大屏 大数据毕业设计 电商知识图谱
  17. 分治法--处理数列问题
  18. 面试官提出的Io问题 如何去做解答呢?
  19. python 判断是否为数字(整型、浮点型),Python中判断输入是否为数字的实现代码
  20. 【“探索者”小车】机器人大赛“探索者”全地形小车参赛经验分享

热门文章

  1. Web 趋势榜:上周最有意思、最热门的 10 大 Web 项目 - 210625
  2. 解决windows版 duet display无法正常连接 【看完就会】
  3. 巨鲸任务调度平台:spark flink任务调度
  4. helm部署minio
  5. K8S集群搭建:安装kubeadm集群部署工具
  6. 【辟谣】java中的final方法在新版的jvm中能提高效率?
  7. GitLab添加SSH Keys并连接(windows)
  8. question: student_link
  9. 万字长文总结八大经典内部排序算法
  10. CAN 总线 之六 BOSCH CAN 比特位填充(编码规则)、归零编码(RZ)和不归零编码(NRZ)