C++继承场景下为何父类默认构造被错误调用而非匹配带参构造?
问题根因
C++的派生类构造函数有固定的执行逻辑:
- 构造派生类对象时,会先构造其包含的基类子对象,再执行派生类自身的构造逻辑。
- 如果派生类构造函数没有在初始化列表中显式指定要调用的基类构造函数,编译器会自动隐式调用基类的无参默认构造函数。
- 这个过程完全不会根据派生类构造的参数数量、类型自动匹配基类的带参构造,因此你的代码中
Rectangle(int x, int y)未指定基类构造,编译器自动插入了Shape()的调用,最终输出了默认构造的打印内容。
补充:如果基类没有定义无参构造函数,这种未显式指定基类构造的派生类代码会直接触发编译报错。
正确修改方式
要显式指定调用基类的双int参数构造,需要在派生类构造函数的初始化列表中声明对应调用:
class Rectangle : public Shape{ public: // 初始化列表语法:基类构造(参数) Rectangle(int x, int y) : Shape(x, y) { std::cout << height; } };
修改后实例化Rectangle test(10, 19);时,执行顺序为:
- 调用
Shape(int x, int y),输出in const param,并将width、height分别赋值为10、19 - 执行派生类构造体的逻辑,输出height值19
关于Java构造规则的澄清
你提到的"像Java那样自动匹配父类参数构造"属于误解:Java的构造调用逻辑和C++完全一致——如果派生类构造函数没有在第一行显式写super(参数列表),编译器会自动隐式调用父类的无参构造,也不会自动透传派生类的构造参数。Java中要调用父类的带参构造,同样必须显式书写super(x, y)完成指定。
内容的提问来源于stack exchange,提问作者ary kun
相关产品推荐
相关产品推荐

