【问题标题】:Inherit and overload default constructor继承和重载默认构造函数
【发布时间】:2016-12-05 17:30:09
【问题描述】:

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

【问题讨论】:

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

标签: c++ class oop inheritance constructor


【解决方案1】:

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

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

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

B() = default;

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2015-07-09
    • 2018-04-18
    • 2021-06-02
    • 1970-01-01
    • 2010-10-06
    • 2017-10-04
    相关资源
    最近更新 更多