有没有办法在继承构造函数时访问初始值设定项列表

Is there a way to access the initializer list when inheriting constructors?

本文关键字:列表 访问 继承 构造函数 有没有      更新时间:2023-10-16

我目前正在研究一个类层次结构,其中类B继承自A并使用C++的功能,该功能允许通过键入直接继承构造函数:

using A::A;

而是复制所有现有的构造函数。有没有办法初始化类B的类属性,否则将由初始化列表初始化?

类层次结构如下所示,不使用构造函数继承,并且可以很好地编译:

class A
{
public:
    A (int a)
    {}
};
class B
:
public A
{
    public:
    B (int a)
    :
        A(a),
        blubb(a)
    {}
    float blubb;
};

使用构造函数继承和Revolver_Ocelot建议的答案,代码如下所示:

class A
{
public:
    A (int a)
    {}
};
class B
:
public A
{
    public:
    using A::A;
    float blubb {a};
};

这给出了以下编译时错误消息:

foo.cpp:21:22: error: ‘a’ was not declared in this scope
     float blubb {a};
                  ^
foo.cpp:21:23: error: cannot convert ‘<brace-enclosed initializer list>’ to ‘float’ in initialization
     float blubb {a};
                   ^

在 C++11 中,您可以通过大括号或等于初始化器来初始化类变量,否则成员将默认初始化:

class B : public A
{
    using A::A;
    MyComplexType foo {ConstructorArgument1, ConstructorArgument2};
};

编辑:由于新情况,我将添加新信息。

如果您提到,没有其他选择,如果您想访问基类构造函数参数,则可以使用您想要的签名创建自己的构造函数。但是,这并不意味着您必须复制代码。相反,您可以将大部分工作委托给基类构造函数,仅将类 B 的内容保留在类 B 中:

class B : public A
{
    public:
    using A::A;
    B(int a) : A(a), blubb(a)
    {}
    float blubb;
};

如果使用构造函数参数初始化类 A 中的某个成员,并且派生类有权访问该成员,则可以使用该成员初始化派生类成员:

class A
{
    protected:
    int y;
    public:
    A(int a) : y(a)
    {}
};
class B : public A
{
    int z {y};
    public:
    using A::A;
};