当前位置: 首页 > news >正文

如何对C++虚基类构造函数


下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的。

前面讲过,为了初始化基类的子对象,派生类的构造函数要调用基类的构造函数。对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。

由于继承结构的层次可能很深,规定将在建立对象时所指定的类称为最派生类。C++规定,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的C++虚基类,那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。

从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数。

而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。C++又规定,在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则C++虚基类的构造函数先于非虚基类的构造函数的执行。

下面举一例子说明具有C++虚基类的派生类的构造函数的用法。

 

  1. #include   
  2. class A  
  3. {  
  4. public:  
  5. A(const char *s) { cout< ~A() {}  
  6. };  
  7.  
  8. class B : virtual public A  
  9. {  
  10. public:  
  11. B(const char *s1, const char *s2):A(s1)  
  12. {  
  13. cout< }  
  14. };  
  15.  
  16. class C : virtual public A  
  17. {  
  18. public:  
  19. C(const char *s1, const char *s2):A(s1)  
  20. {  
  21. cout< }  
  22. };  
  23.  
  24. class D : public B, public C  
  25. {  
  26. public:  
  27. D(const char *s1, const char *s2, const char *s3, const char *s4)  
  28. :B(s1, s2), C(s1, s3), A(s1)  
  29. {  
  30. cout< }  
  31. };  
  32.  
  33. void main()  
  34. {  
  35. D *ptr = new D("class A", "class B", "class C", "class D");  
  36. delete ptr;  

 

 

 

 在派生类B和C中使用了C++虚基类,使得建立的D类对象只有一个虚基类子对象。在派生类B,C,D的构造函数的成员初始化列表中都包含了对虚基类A的构造函数。在建立类D对象时。

只有C++虚基类D的构造函数的成员初始化列表中列出的虚基类构造函数被调用,并且仅调用一次,而类D基类的构造函数的成员初始化列表中列出的虚基类构造函数不被执行。这一点将从该程序的输出结果可以看出。













本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/534616,如需转载请自行联系原作者

相关文章:

  • echars 动态加载数据
  • How The Kernel Manages Your Memory
  • Linux内存管理--基本概念【转】
  • UVA 321 The New Villa
  • ASP.NET程序开发范例宝典
  • Jquery实现鼠标双击Table单元格变成文本框,输入内容并更新到数据库
  • 9.Java通过axis调用WebService
  • WCF服务在JavaScript中使用ASP.NET的AJAX方法
  • .net反混淆脱壳工具de4dot的使用
  • 用脚本实现1+2+3...100
  • 域控改ip地址
  • 今天玩VMWARE8.0
  • 洛谷——P1679 神奇的四次方数
  • 怎样解决spoolsv.exe应用程序错误
  • 【TUP第11期】豆瓣网解彦博:好钢用在刀刃上
  • .pyc 想到的一些问题
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Angularjs之国际化
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • mockjs让前端开发独立于后端
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • PHP的类修饰符与访问修饰符
  • React系列之 Redux 架构模式
  • SAP云平台里Global Account和Sub Account的关系
  • Wamp集成环境 添加PHP的新版本
  • 创建一种深思熟虑的文化
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端js -- this指向总结。
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 最近的计划
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (Java)【深基9.例1】选举学生会
  • (LeetCode 49)Anagrams
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (算法)前K大的和
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 未来三学期想要修的课 (日記)
  • (转载)hibernate缓存
  • ./configure、make、make install 命令
  • .bat批处理(一):@echo off
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Web窗口页属性
  • .NET6实现破解Modbus poll点表配置文件
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验