永发信息网

C++继承构造函数调用顺序问题,高手求解。

答案:2  悬赏:60  手机版
解决时间 2021-03-26 06:03
C++继承构造函数调用顺序问题,高手求解。
最佳答案
//先按照继承顺序: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"<//第七步:打印"consC"

回到你的主要问题:为什么会有两次B3*出现?
第一次是由于继承了B3,虽然在C的构造函数的初始化列表里你没看到B3(x)或者B3(),但并不代表B3的构造函数没有在发挥作用。事实上,B3被隐性初始化了,因为B3的构造函数没有参数,所以写不写B3()都无所谓,这里恰好省略了。B1,B2则都是显性初始化,因为它们都需要参数。

第二次是因为C有数据成员memberB3,又一次,你没有在C的构造函数的初始化列表里看到你希望出现的memberB3(),很显然,这又是一次隐性初始化。B3的构造函数再次被暗中调用。

每一次B3的构造函数被调用,都会打印出“consB3 *”。两次被调用,自然打印两次“consB3 *”。
全部回答
1、如果类里面有成员类,成员类的构造函数优先被调用;
2、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);
3、 基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的
顺序而不是它们在成员初始化表中的顺序;
4、成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中
被声明的顺序而不是它们出现在成员初始化表中的顺序;
5、派生类构造函数
作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递
给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于
正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
普通快递和EMS有什么区别?这么多快递公司哪
为什么零钱转入零钱通,不能再从零钱通转入银
几百8÷23=几……
如何锻炼小肚子
审判奶跟专业奶有什么区别吗
何为真正的“高富帅”?
正面五个雷字反面勒令铜钱
30元流量包送180元话费怎么收费
甲某出差回来,报销差旅费1 500元,原预借2 0
圆通快递官网200461751634
最早天津煤火上烙饼用的支炉哪里有卖?是那种
滥用成语的广告词有哪些
92平方装修8万能搞定吗
知乎 是吃得好重要 还是护肤品重要
2017年在北京学习HTML5培训好不?找工作容易
推荐资讯
怎么洞察市场,分析社会的需求,判断社会的发
求救!孝感市肖港镇中心小学几十名教师长期没
以下是我们熟悉的实验室制取气体的发生装置、
监控摄像头里拍到的鬼是真实的吗?
垂直度后面的数字代表什么意思
将官和校官哪个大
工商银行信用卡牡丹卡,额度基本上是多少的啊
农村自建房价值如何评估?
袍用有趣的方法记住袍
求有创意的员工激励方案
小芬和小刚分别从一条跑道的两端相对走来,小
收款客户与应收客户的区别
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?