c++ 继承无基构造函数没有初始化列表低于 c++ 11?

问题描述

我正在用 C++ 实现装饰器设计模式,但遇到了这个问题(代码取自 https://www.studytonight.com/cpp/initializer-list-in-cpp.php):

#include<iostream>
using namespace std;

class Base_
{
    public:
    // parameterized constructor
    Base_(int x)
    {
        cout << "Base Class Constructor. Value is: " << x << endl;
    }
};

class InitilizerList_:public Base_
{
    public:
    // default constructor
    InitilizerList_()
    {
        Base_ b(10);
        cout << "InitilizerList_'s Constructor" << endl;
    }
};

int main()
{
    InitilizerList_ il;
    return 0;
}

正如网站所说,这不会编译,因为基构造函数在派生构造函数之前被调用,这个问题使用初始化列表解决。我的问题是:这可以在没有初始化列表的情况下实现吗,如果可以,如何实现?初始值设定项列表是在 c++ 11 中引入的(我认为)那么如果您尝试在 c++ 98 中执行此操作怎么办?

解决方法

从派生类构造函数委托给基类构造函数的语法如下

class InitilizerList_ : public Base_
{
public:
    // default constructor
    InitilizerList_() : Base_(10)
    {
        cout << "InitilizerList_'s Constructor" << endl;
    }
};
,

您对术语感到困惑。有一个初始化列表,看起来像{ for,bar,baz,... },有一个std::initializer_list类型可以包装一个初始化列表,然后还有类成员初始化列表,用于初始化类中的成员班级。

最后一个是您想要的,并且自 C++ 创建以来一直是 C++ 的一部分。使用一个会给你

InitilizerList_() : Base_(10)
{
    cout << "InitilizerList_'s Constructor" << endl;
}