当继承构造函数时,是否有一种方法可以访问初始化列表?

3

我目前正在处理一个类层次结构,其中一个类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};
                   ^
1个回答

3
在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;
};

你的建议似乎不起作用,请查看已编辑的问题。我添加了两个示例和错误消息。 - jhoepken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接