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

为何代码输出20000?虚继承中显式调用基类构造函数却被忽略

问题解析:虚继承下构造函数的调用规则

你遇到的这个问题,核心原因是C++虚继承的特殊构造规则——虚基类的构造函数是由最派生类直接负责初始化的,中间派生类对虚基类构造函数的显式调用会被编译器忽略。

具体拆解你的代码:

  1. 先看继承链:Prius → Toyota(虚继承Car) → Car
  2. 当你创建Prius p(30000)对象时,按照C++标准,虚基类Car的构造函数必须由最派生类Prius来初始化,而不是中间的Toyota。
  3. 你的Prius构造函数只在初始化列表里调用了Toyota(b),没有显式指定Car的构造方式,所以编译器会自动调用Car的默认构造函数(也就是把price设为20000的版本),完全忽略了Toyota构造函数里的Car(b)调用。

解决方法:

如果想让Car的带参构造函数生效,需要在最派生类Prius的初始化列表里直接调用虚基类的构造函数,修改后的代码如下:

#include <iostream>
struct Car {
    Car() : price(20000) {}
    Car(double b) : price(b*1.1) {}
    double price;
};
struct Toyota : public virtual Car {
    Toyota(double b) : Car(b) {} // 这里的调用会被忽略,因为是虚基类
};
struct Prius : public Toyota {
    Prius(double b) : Car(b), Toyota(b) {} // 最派生类直接初始化虚基类
};
int main(int argc, char** argv) {
    Prius p(30000);
    std::cout << p.price << std::endl; // 现在会输出33000
}

这个规则的设计目的是为了避免多继承(尤其是菱形继承)场景下,虚基类被多次初始化的问题——确保虚基类只会被初始化一次,且由最底层的派生类控制。

内容的提问来源于stack exchange,提问作者code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:50