继承并重载默认构造函数

时间:2015-04-06 18:48:44

标签: c++ class oop inheritance constructor

我一直在寻找这个,我很惊讶我还没找到任何东西。为什么我不能使用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;
}

1 个答案:

答案 0 :(得分:10)

问题是默认构造函数不是继承的。来自[class.inhctor] / p3:

  

对于继承的构造函数[...]的候选集中的每个非模板构造函数,构造函数使用相同的构造函数特性隐式声明,除非存在具有相同签名的用户声明的构造函数在使用声明出现的完整类中,或者构造函数将是该类的默认,复制或移动构造函数

您还有一个用户声明的构造函数,它禁止创建隐式默认构造函数。只需添加一个默认值即可使用:

B() = default;