删除构造函数继承

里克·德·沃特

构造函数继承的要求之一是,派生类不能具有具有相同签名的任何构造函数。但是,我不确定删除的函数在这些规则下的行为。

class Foo
{
    public:
    Foo() = delete;
    Foo(const Foo& a_Foo) = delete;
    Foo(int a_Value) : m_Value(a_Value) {}

    private:
    int m_Value;
};

class Bar : public Foo
{
    public:
    using Foo::Foo;
    Bar() : Foo(7) {};
    Bar(const Bar& a_Bar) : Foo(12) {};
};
  • 删除的构造函数是否完全继承?
  • 如果是这样,Bar()并且Foo()具有相同的签名,这会使代码无效吗?
  • 您可能会争辩Foo(const Foo& a_Foo)Bar(const Bar& a_Bar)有不同的签名。复制构造函数在构造函数继承下如何表现?
Brian Bi

默认,复制和移动构造函数不会被继承,继承构造函数也不能隐式声明派生类的副本或移动构造函数。同样,如果派生类中已经存在具有相同签名的构造函数,则继承的构造函数声明实际上只会“跳过”基类构造函数。

对于继承的构造函数候选集中的每个非模板构造函数,除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外,除非具有用户声明的构造函数,否则该构造函数将隐式声明为具有相同的构造函数特性完整类中出现使用声明的签名相同,否则构造函数将是该类的默认,复制或移动构造函数。

([class.inhctor] / 3)

另外,如果删除了相应的基类构造函数,则继承的构造函数也会被删除。

这样声明的构造函数与中的相应构造函数具有相同的访问权限X如果删除了相应的构造函数X(8.4)则会将其删除。继承的构造函数不得显式实例化(14.7.2)或显式专门化(14.7.3)。

([class.inhctor] / 4)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章