C++派生类未显式继承基类构造函数初始化实例报错问题
问题原因分析
该报错的核心原因是 C++默认不会自动继承基类的构造函数,具体说明如下:
1. 底层规则
派生类的构造函数默认只会自动调用基类的无参构造函数,标准之所以设计为默认不继承带参构造函数,是因为派生类通常会有独有的成员变量,自动继承基类构造很容易出现派生类成员未初始化的安全问题。
如果需要复用基类的带参构造函数,C++11及以上标准要求你必须在派生类中显式声明继承,语法为 using 基类名::基类名;。
你提供的代码中类B没有做上述显式声明,编译器自然无法识别到B存在接收int参数的构造函数,因此抛出匹配失败的错误。
另外你的原始代码还存在两处语法疏漏:
- 类A的成员变量
int _a定义后缺少分号 - 类B的定义结束后缺少分号
2. 修复方案(C++11及以上)
通过显式声明继承构造函数即可解决问题,修复后代码如下:
class A { public: int _a; // 补充缺失的分号 A(int a) : _a { a} { } }; class B : public A { public: using A::A; // 显式继承A的所有构造函数 }; // 补充缺失的分号
修复后执行 B a(5); 即可正常编译,继承来的构造函数会自动调用基类对应构造完成基类部分的初始化。
3. 兼容旧标准的方案
如果你使用的是C++11之前的不支持构造函数继承的旧标准,可以手动实现派生类的带参构造函数,主动调用基类构造即可:
class B : public A { public: B(int a) : A(a) {} // 手动实现带参构造,调用基类构造 };
内容的提问来源于stack exchange,提问作者luis
相关产品推荐
相关产品推荐

