C++虚拟继承三角场景下的代码输出与成员访问问题咨询
代码输出与继承问题解析
一、输出结果的产生过程
创建C类对象c时,构造函数执行顺序遵循虚拟继承规则:
- 首先调用虚拟基类
A的构造函数,将A::x初始化为1; - 接着调用
B的构造函数,将B::x初始化为2; - 最后调用
C的构造函数,对某个x赋值为3。
而print()是A类的成员函数,其作用域属于A,执行c.print()时访问的是A类自身的成员变量x,也就是最初被初始化为1的值,因此输出X: 1。
二、为什么C的构造函数中x=3修改的是B::x而非A::x
这是C++名字查找规则导致的:
- 在
C类作用域中查找x时,会优先查找直接基类B中的成员。B类定义了自己的x,这个名字会隐藏虚拟基类A中的x(除非显式指定A::x)。 - 因此
C的构造函数里x=3,实际访问的是B类的x,而非A类的x。如果要修改A::x,需要写成A::x = 3。
三、即便C常规继承B,是否仅存在一个A类的实例?
是的,整个继承体系中只会存在一个A类的实例。
因为B是虚拟继承A,C也是虚拟继承A——虚拟继承的核心作用就是让整个继承树共享同一个虚拟基类实例,不管后续派生类以何种方式继承(常规或虚拟),只要路径上的基类是虚拟继承该类,就只会创建一个基类实例。
内容的提问来源于stack exchange,提问作者Yair
相关产品推荐
相关产品推荐

