C++无基类默认构造函数 低于C++11版本不使用初始化列表如何实现继承?
问题解答
误区澄清
构造函数初始化列表是C98就已支持的原生语法特性,并非C11引入。你混淆了两个概念:C11新增的是std::initializer_list标准容器类,和构造函数后跟的初始化列表是完全无关的两个语法特性,C98环境下完全可以正常使用构造函数初始化列表。
原代码编译失败原因
你的代码中基类
Base_仅提供了接收int参数的有参构造函数,没有默认无参构造函数。派生类构造函数如果没有在初始化列表中显式调用基类的有参构造,编译器会自动尝试插入基类无参构造的调用逻辑,但基类不存在无参构造,因此直接编译报错。你在派生类构造函数内部写的
Base_ b(10);只是创建了一个和父类子对象完全无关的局部栈对象,不会对父类的构造逻辑产生任何影响。
标准解决方案(C++98可直接使用)
直接在派生类构造函数的初始化列表中显式调用基类有参构造即可,这也是C++继承场景下的标准写法:
#include<iostream> using namespace std; class Base_ { public: Base_(int x) { cout << "Base Class Constructor. Value is: " << x << endl; } }; class InitilizerList_:public Base_ { public: // 初始化列表显式调用基类有参构造,C++98支持 InitilizerList_() : Base_(10) { cout << "InitilizerList_'s Constructor" << endl; } }; int main() { InitilizerList_ il; return 0; }
运行输出:
Base Class Constructor. Value is: 10 InitilizerList_'s Constructor
绕开初始化列表的变通方案(不推荐)
如果确实有特殊原因不能使用初始化列表,只能通过「基类新增默认构造+后期初始化接口」的方式曲线实现,但该方案会带来额外的初始化开销,资源类场景下可能引发bug,非必要不要使用:
#include<iostream> using namespace std; class Base_ { int val; public: // 新增默认构造函数 Base_() : val(0) {} // 新增后期初始化接口 void init(int x) { val = x; cout << "Base Class post-init. Value is: " << val << endl; } Base_(int x) : val(x) { cout << "Base Class Constructor. Value is: " << x << endl; } }; class InitilizerList_:public Base_ { public: InitilizerList_() { // 调用后期初始化接口传递参数 init(10); cout << "InitilizerList_'s Constructor" << endl; } }; int main() { InitilizerList_ il; return 0; }
内容的提问来源于stack exchange,提问作者samjarvis
相关产品推荐
相关产品推荐

