You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++虚拟继承三角场景下的代码输出与成员访问问题咨询

代码输出与继承问题解析

一、输出结果的产生过程

创建C类对象c时,构造函数执行顺序遵循虚拟继承规则:

  1. 首先调用虚拟基类A的构造函数,将A::x初始化为1;
  2. 接着调用B的构造函数,将B::x初始化为2;
  3. 最后调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:10:03