You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 13:15:11