C++继承代码出现编译错误,求错误原因及原理讲解
C++继承场景构造函数编译错误原因说明
核心错误原因
- C++继承体系中,派生类对象构造时必须先完成基类子对象的初始化操作
- 你的Base类仅显式声明了带int参数的有参构造函数,按照C++语法规则,只要类主动声明了任意构造函数,编译器就不会再自动生成默认无参构造函数
- 你编写的Derived类构造函数
Derived(int b):y(b)没有在初始化列表中显式调用Base类的有参构造,编译器会默认尝试调用Base类的无参构造函数完成基类子对象初始化,但Base类不存在无参构造,因此直接触发编译错误。
修复方案
共有两种可行修复方式:
方案1:给Base类补充默认无参构造
你可以给Base类增加无参构造函数,保证编译器可以找到可用的基类构造逻辑,示例代码:
class Base { protected: int x; public: // 新增无参构造 Base():x(0) { cout<<"Base 默认构造"<<endl; } Base(int a): x(a) { cout<<"Base 有参构造"<<endl; } };
方案2:在Derived构造函数的初始化列表中显式调用Base有参构造
你可以在Derived的构造函数中主动指定调用Base的有参构造,传入对应参数即可,示例代码:
class Derived: public Base { private: int y; public: // 初始化列表先调用Base的有参构造 Derived(int a, int b):Base(a),y(b) { cout<<"Derived"<<endl; } void print() { cout<<x<<" "<<y<<endl; } }; // main函数对应修改为: int main() { Derived d(10,20); d.print(); return 0; }
修改后代码可以正常编译运行,输出结果为:
Base 有参构造 Derived 10 20
内容的提问来源于stack exchange,提问作者Hash include
相关产品推荐
相关产品推荐

