C++:如何从单参数派生类构造函数调用双参数基类构造函数
问题解析与解决方案
为什么会出现这个错误?
你碰到的这个问题,其实是C++构造函数初始化规则里的常见坑,核心原因有两个:
- 编译器的默认行为:当派生类构造函数没有显式在初始化列表中调用基类构造函数时,编译器会自动尝试调用基类的默认构造函数(也就是不带任何参数的构造函数)。但你的
shape类只自定义了带两个int参数的构造函数,这时候编译器就不会自动生成默认构造函数了,所以才会报错说“类‘shape’不存在默认构造函数”。 - 你的代码误区:你在
square构造函数里写的shape(d, d);根本不是在初始化基类对象,而是在构造函数体里创建了一个临时的shape局部对象,用完就销毁了,完全没起到初始化基类部分的作用——这是很多新手容易踩的小陷阱!
怎么修改代码实现预期需求?
正确的做法是在派生类构造函数的初始化列表中调用基类的双参数构造函数,这样就能直接初始化基类的height和width了。修改后的代码如下:
#include <iostream> class shape { private: int height; int width; public: shape(int h, int w) : height(h), width(w) {} // 这里也可以用初始化列表优化自己的构造函数 void display() { std::cout << height << "\t" << width << std::endl; } }; class square : public shape { public: square(int d) : shape(d, d) {} // 重点:在初始化列表中调用基类构造函数 }; // 测试示例 int main() { square s(5); s.display(); // 会输出 5 5 return 0; }
额外补充:什么时候需要基类默认构造函数?
如果你的派生类有多个构造函数,其中某些构造函数不需要给基类传特定参数,这时候可以给基类手动添加默认构造函数,比如:
class shape { // ... 其他成员 ... public: shape() = default; // 让编译器生成默认构造函数 shape(int h, int w) : height(h), width(w) {} // ... 其他成员 ... };
不过在你的这个场景里,正方形的边长必然对应基类的height和width,所以用初始化列表调用双参数构造函数是最合理的方案。
内容的提问来源于stack exchange,提问作者Shiladitya Bose
相关产品推荐
相关产品推荐

