class B1
{public:B1(int i) {cout<<"consB1"<<i<<endl;}
};//定义基类B1
class B2
{public:B2(int j) {cout<<"consB2"<<j<<endl;}
};//定义基类B2
class B3
{
public:B3(){cout<<"consB3 *"<<endl;}
};//定义基类B3
class C: public B2, public B1, public B3
{public: C(int a,int b,int c,int d,int e):B1(a),memberB2(d),memberB1(c),B2(b){m=e; cout<<"consC"<<endl;}
private:B1 memberB1;B2 memberB2;B3 memberB3;int m;
};//继承类C
void main()
{ C  obj(1,2,3,4,5);  }//主函数
运行结果:consB2 2 consB1 1 consB3 * consB1 3 consB2 4 consB3 * consC//先按照继承顺序:B2,B1,B3 

//第一步:先继承B2,在初始化列表里找到B2(b),打印"constB22"

//第二步:再继承B1,在初始化列表里找到B1(a),打印"constB11"

//第三步:又继承B3,在初始化列表里找不到B3(x), 则调用B3里的默认构造函数B3(),打印"constB3 *"

//再按照数据成员定义顺序:memberB1, memberB2, memberB3

//第四步:在初始化列表里找到memberB1(c),初始化一个B1对象,用c为参数,则调用B1的构造函数,打印"constB13"

//第五步:在初始化列表里找到memberB2(d),初始化一个B2对象,用d为参数,则调用B2的构造函数,打印"constB24"

//第六步:在初始化列表里找不到memberB3(x),则调用B3里的默认构造函数B3(),打印"constB3 *"

//最后完成本对象初始化的剩下部分,也就是C自己的构造函数的函数体:{m=e; cout<<"consC"<<endl;}

//第七步:打印"consC"

回到你的主要问题:为什么会有两次B3*出现?

第一次是由于继承了B3,虽然在C的构造函数的初始化列表里你没看到B3(x)或者B3(),但并不代表B3的构造函数没有在发挥作用。事实上,B3被隐性初始化了,因为B3的构造函数没有参数,所以写不写B3()都无所谓,这里恰好省略了。B1,B2则都是显性初始化,因为它们都需要参数。第二次是因为C有数据成员memberB3,又一次,你没有在C的构造函数的初始化列表里看到你希望出现的memberB3(),很显然,这又是一次隐性初始化。B3的构造函数再次被暗中调用。每一次B3的构造函数被调用,都会打印出“consB3 *”。两次被调用,自然打印两次“consB3 *”。

C/C++---中多继承构造函数调用顺序相关推荐

  1. 继承构造函数调用顺序_C ++中带有继承的构造函数调用的顺序

    继承构造函数调用顺序 Base class constructors are always called in the derived class constructors. Whenever you ...

  2. C++继承中构造函数、析构函数调用顺序及虚析构函数

    首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...

  3. C++ 基类,子对象,派生类构造函数调用顺序

    #include <iostream> using namespace std;class A {public:A( ) {cout << "A Constructo ...

  4. Java构造函数调用顺序问题

    今天对Java的构造函数调用顺序进行研究,使用的是与C++类似的方法,即不对源码进行研究,而是直接通过打印代码对构造函数的调用顺序进行研究. 代码如下,使用的是Java核心技术中的代码,对其进行了改造 ...

  5. Python中菱形继承的MRO顺序及property属性

    Python中菱形继承的MRO顺序及property属性 文章目录 Python中菱形继承的MRO顺序及property属性 一.Python中菱形继承的MRO顺序 1. 单独调用父类的方法 2. 多 ...

  6. C++虚继承(七) --- 虚继承对基类构造函数调用顺序的影响

    继承作为面向对象编程的一种基本特征,其使用频率非常高.而继承包含了虚拟继承和普通继承,在可见性上分为public.protected.private.可见性继承比较简单,而虚拟继承对学习c++的难度较 ...

  7. C++虚继承(九) --- 构造函数调用顺序的实用之处

    虚拟继承是C++语言中一个非常重要但是又比较生僻的存在,它的定义非常简单,但是对于理解C++的继承机制却是非常有用的.笔者最近学习过程中发现对C++的虚拟继承不是很明朗,故在这里对虚继承做个小结. 首 ...

  8. java构造函数调用其他程序的顺序_java初始化构造函数调用顺序

    看我大师归来: 1. Base b = new Sub(); 2. Base b = 直接忽略,从 new Sub();开始 3. 类加载器加载 Base,Sub 类到jvm; 4. 为Base,Su ...

  9. 菱形继承中构造函数调用问题

    菱形继承中构造函数调用问题 在某一个虚基类的任何一个派生类的构造函数中,都要将该虚基类的构造函数显示列出来. 包含虚基类的派生类对象的构造函数的调用顺序如下: 虚基类的构造函数在非虚基类之前调用. 若 ...

最新文章

  1. linux终端历史记录文件夹,如何通过命令行查看`.bash_history`文件?
  2. Tomcat6 Spring3 问题:严重: Error configuring application listener of class org.springframework.web.conte
  3. 如何设置照片的高度没有滚条_基金定投选几只合适,如何设置止盈止损,有没有好的组合推荐?...
  4. testng使用DataProvider+Excel实现DDT
  5. Kali学习笔记15:防火墙识别、负载均衡识别、WAF识别
  6. python dll load fail_python报错DLL load failed:找不到模块怎么解决?
  7. JVM总结(一):概念----(无节操转载,潜心学习)
  8. Atitit 知识点 文章 框架 结构 attilax总结.docx
  9. matlab的toc,Python模仿matlab的tic/toc计时
  10. 广东省工科赛 智能终端配送机器人:创作心路历程,踩过的坑和解决方案
  11. 食堂配送公司订餐微信小程序开发制作定制功能需求文档
  12. 阿里云播放器AliyunPlayer的走马灯组件的位置
  13. 计算机xp重装无声音怎么办,WinXP电脑声音不正常的处理方法
  14. Python生成 gif 动图
  15. Django-admin后台LOGO字样修改方法
  16. mapstd matlab详解,Matlab中的数据预处理-归一化(mapminmax)与标准化(mapstd)
  17. 标准化软件应用程序设计
  18. Linux如何打开cp2k,centos7安装并行版cp2k6.1-POPT
  19. NVIC_EnableIRQ使能无法进行的原因
  20. uniapp离线打包具体步骤

热门文章

  1. localStorage的存储,读取,删除
  2. 【luogu P1119】灾后重建
  3. 按照这些优化技巧来写 SQL,连公司 DBA 也鼓掌称赞!
  4. @click.native和@click的区别?
  5. Awstats 日志分析 安装
  6. ts语法基础——基础类型
  7. 2019 CSDN 人气最高博客排名榜,人气最高的前十博主
  8. git --rebase (develop|AM/REBASE)
  9. 前瞻《飞驰人生》陈一愚:变与不变是韩寒自我经历投射
  10. jacoco单测报告怎么同步到sonarqube