一道c++的题。请问题中的b,b1,b2赋值结果是怎么来的?求详细的过程。
1个回答
展开全部
这种语法在C++中叫做初始化列表,在 C++ 中提供了初始化列表对成员变量进行初始化。构造函数里那些带等号的参数就是默认参数,也就是说如果调用构造函数没有传参数默认使用的参数值就是等号后面的值。
D objD;表明调用的D的构造函数使用的全是默认参数,等价于 D objD(1, 2, 3, 4),所以objD.k == 4;后面的B(i)相当于调用了B(1),所以objD.b == 1;B1(j1)就是调用了B1(2, 21),因为第二参数没传用的就是等于号后面的默认值,所以objD.b1 == 21;B2(j2)调用的就是B2(3, 22),objD.b2 == 22。
D objD;表明调用的D的构造函数使用的全是默认参数,等价于 D objD(1, 2, 3, 4),所以objD.k == 4;后面的B(i)相当于调用了B(1),所以objD.b == 1;B1(j1)就是调用了B1(2, 21),因为第二参数没传用的就是等于号后面的默认值,所以objD.b1 == 21;B2(j2)调用的就是B2(3, 22),objD.b2 == 22。
追问
但b1、b2不是也含有b吗,它们分别用2、3初始化各自从B那继承的b,而D继承b1、b2,那b1、b2初始化后它们的b为什么不会修改B初始化后b的值,即小b的值先后等于1、2、3,最终的值是3?
追答
B1和B2在继承B的时候前面加了一个Virtual关键字,也就是虚拟继承,D类同时继承了B1和B2,虚拟继承和普通继承的区别是普通继承会包含两份B的数据,而虚拟继承只会包含B的一份数据拷贝。在使用初始化列表初始化父类的时候直接调用B(1)就已经初始化了共有的那个B数据,之后的B1和B2就不会再初始化共有B数据了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询