派生类是否需定义继承构造器?C++构造器调用错误求助
构造器调用错误的原因与解决方法
错误原因
创建派生类newFoo对象时,编译器会自动先调用基类foo的默认构造函数(无参构造)。但你的基类foo只定义了一个带4个参数的构造函数,此时编译器不会自动生成默认构造函数,因此找不到匹配的foo::foo(),触发编译错误。
解决方案
方案1:派生类构造显式调用基类带参构造
如果需要继承基类的成员初始化逻辑,就在派生类构造函数的初始化列表中显式调用基类的带参构造,传入所需参数:
class newFoo: public foo{ // Derived Class private: int houseNumber; public: // 初始化列表中调用基类构造,传递必要参数 newFoo(int hn, int c, int y, string fn, string ln) : foo(c, y, fn, ln) { houseNumber = hn; }; };
更高效的写法是把派生类成员也放到初始化列表:
newFoo(int hn, int c, int y, string fn, string ln) : foo(c, y, fn, ln), houseNumber(hn) {}
方案2:给基类添加默认构造函数
如果基类本身需要支持无参初始化,直接在基类中显式定义默认构造函数即可:
class foo { // Base Class private: int century, year; string firstName, lastName; public: // 带参构造(改用初始化列表优化) foo(int i1, int i2, string s1, string s2) : century(i1), year(i2), firstName(s1), lastName(s2) {}; // 显式定义默认构造,按需初始化成员 foo() : century(0), year(0), firstName(""), lastName("") {}; };
此时派生类的原构造函数就能正常工作,编译器会自动调用基类的默认构造。
补充:初始化列表的优势
用初始化列表初始化成员变量比在构造函数体内赋值更高效,它直接完成成员的初始化,避免了先默认初始化再赋值的冗余过程,建议优先使用。
内容的提问来源于stack exchange,提问作者BrianDawe
相关产品推荐
相关产品推荐

