有没有办法在继承构造函数时访问初始化程序列表?

时间:2016-03-03 10:18:36

标签: c++ c++11 inheritance initialization

我目前正在开发一个类层次结构,其中类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 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以使用初始化类变量through brace or equals initializer,否则将在默认初始化成员时使用该变量:

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