继承和重载默认构造函数(Inherit and overload default construct

2019-09-28 15:30发布

我一直在寻找这一点,我很惊讶,我没有发现任何东西。 为什么我不能继承使用基类构造函数using在派生类中声明,并添加过载? 我使用Visual C ++ 2013,基类构造函数被忽略时,默认构造b

error C2512: 'B' : no appropriate default constructor available

我已经通过重新定义构造函数处理了这一点,但我不喜欢这样。 这只是一个小例子,它不会打扰我,如果我只有一个基类的构造函数。

struct A
{
    A() : a(10) {}

    int a;
};

struct B : A
{
    using A::A;

    explicit B(int a) { this->a = a; }
};

int main()
{
    B b;
}

Answer 1:

问题是,默认的构造函数是不能继承的。 从[class.inhctor] / P3:

对于候选组中继承构造函数[..]的每一个非模板的构造函数,构造函数是隐含相同的构造特征声明,除非有一个在其中使用声明出现在完整的类相同签名用户声明的构造或构造将是一个默认情况下,复制或移动构造该类

你也有一个用户声明的构造抑制了隐含的默认构造函数的创建。 只需添加一个默认的一个,使其工作:

B() = default;


文章来源: Inherit and overload default constructor