C++ 继承并重载默认构造函数

C++ 继承并重载默认构造函数,c++,class,oop,inheritance,constructor,C++,Class,Oop,Inheritance,Constructor,我一直在寻找这个,我很惊讶我什么也没找到。为什么我不能使用和声明继承基类构造函数,并在派生类中添加重载?我使用Visual C++ 2013,默认构造“代码> B >:< /P>时忽略基类构造函数 error C2512: 'B' : no appropriate default constructor available 我通过重新定义构造函数来解决这个问题,但我不喜欢这样。这只是一个很小的例子,如果我只有一个基类构造函数,我就不会感到困扰 struct A { A() : a(10

我一直在寻找这个,我很惊讶我什么也没找到。为什么我不能使用
声明继承基类构造函数,并在派生类中添加重载?我使用Visual C++ 2013,默认构造“代码> B<代码> >:< /P>时忽略基类构造函数
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;
}

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

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

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

B() = default;

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

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

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

B() = default;

@RSahu如果没有
B
@RSahu
B(int)
中的另一个构造函数,它将是正确的,因为它正在抑制默认构造函数的创建。他可以删除它,也可以自己创建一个。@0x499602D2,不应该
B
使用A::A之后从
A
继承默认构造函数?@RSahu[class.inhctor]/p3:对于继承构造函数的候选集中的每个非模板构造函数[…],除非在出现using声明的完整类中有一个用户声明的构造函数具有相同的签名,或者该构造函数将是该类的默认构造函数、复制构造函数或移动构造函数,否则构造函数将以相同的构造函数特征隐式声明。@0x499602D2,感谢您的挖掘。这就解释了编译器的问题。这将是这个问题的完美答案。@RSahu如果没有
B
中的另一个构造函数,它将是正确的@RSahu
B(int)
正在禁止创建默认构造函数。他可以删除它,也可以自己创建一个。@0x499602D2,不应该
B
使用A::A之后从
A
继承默认构造函数?@RSahu[class.inhctor]/p3:对于继承构造函数的候选集中的每个非模板构造函数[…],除非在出现using声明的完整类中有一个用户声明的构造函数具有相同的签名,或者该构造函数将是该类的默认构造函数、复制构造函数或移动构造函数,否则构造函数将以相同的构造函数特征隐式声明。@0x499602D2,感谢您的挖掘。这就解释了编译器的问题。这将是对这个问题的完美回答。