为何代码输出20000?虚继承中显式调用基类构造函数却被忽略
问题解析:虚继承下构造函数的调用规则
你遇到的这个问题,核心原因是C++虚继承的特殊构造规则——虚基类的构造函数是由最派生类直接负责初始化的,中间派生类对虚基类构造函数的显式调用会被编译器忽略。
具体拆解你的代码:
- 先看继承链:
Prius→Toyota(虚继承Car) →Car - 当你创建
Prius p(30000)对象时,按照C++标准,虚基类Car的构造函数必须由最派生类Prius来初始化,而不是中间的Toyota。 - 你的
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
相关产品推荐
相关产品推荐

