继承并重载默认构造函数

Inherit and overload default constructor

本文关键字:构造函数 默认 重载 继承      更新时间:2023-10-16

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

问题是默认构造函数没有继承。来自[class.inctor]/p3:

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

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

B() = default;