构造函数继承的一个要求是派生类不能具有任何具有相同签名的构造函数。但我不确定删除函数在这些规则下的行为方式。
onreadystatechange
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)
有不同的签名。复制构造函数如何在构造函数继承下运行?答案 0 :(得分:6)
默认,复制和移动构造函数不继承,也不能继承构造函数隐式声明派生类的复制或移动构造函数。此外,继承构造函数声明基本上只是跳过"跳过"如果已经在派生类中具有相同签名的构造函数,则为基类构造函数。
对于构造函数以外的候选继承构造函数集中的每个非模板构造函数 没有参数或具有单个参数的复制/移动构造函数,构造函数是隐式的 声明具有相同的构造函数特征,除非有一个用户声明的构造函数具有相同的构造函数 完整类中的签名,其中出现using声明或构造函数是默认值, 复制或移动该类的构造函数。
([class.inhctor] / 3)
此外,如果删除了相应的基类构造函数,则删除继承的构造函数。
如此声明的构造函数与
X
中的相应构造函数具有相同的访问权限。它被删除了 删除X
中的相应构造函数(8.4)。继承构造函数不应显式实例化(14.7.2)或明确专门化(14.7.3)。
([class.inhctor] / 4)
答案 1 :(得分:2)
Foo
构造函数已删除,因此您无法定义使用已删除的Bar
构造函数的类Foo
的构造函数。在那里谈论继承是没有意义的,因为你永远不能创建使用已删除的Bar
构造函数的类Foo
的对象。
删除的构造函数是否完全继承?
没有。它们被删除,没有任何东西可以继承。
如果是这样,Bar()和Foo()具有相同的签名,这是否成功 代码无效?
默认构造函数不能被继承。
你可以说Foo(const Foo& a_Foo)和Bar(const Bar& a_Bar) 有不同的签名。复制构造函数如何表现 构造函数继承?
复制构造函数也不能继承。
答案 2 :(得分:0)
考虑以下示例:
class Symbol {
public:
Symbol() = delete;
Symbol(char ch) : c{ch} {}
private:
char c;
//
};
class Derived : Symbol {
public:
private:
int i;
};
class NotDerived {
public:
private:
int i;
};
以下行将无法编译。您不能使用已删除的构造函数创建类的对象。每个人都知道。
// Can't create an object because of deleted constructor.
Symbol sym;
但是,您可以使用重载的构造函数创建基类的对象:
// Parametrized constructor, this one is fine.
Symbol sym_char('a');
Derived
类使用: public
继承,继承了基础Symbol
类的所有内容,包括已删除的构造方法。确实,如果Symbol
类具有删除的构造函数,不允许您使用默认构造函数创建该类的对象,那么在逻辑上Derived
类也应禁止您使用删除的对象来创建该类的对象构造函数。
// note: default constructor of 'Derived' is implicitly deleted because base class 'Symbol' has a deleted default constructor
// The deleted consturctor is inherited from the base class.
Derived d;
Derived
类继承了Symbol
类的所有方法,包括所有已删除的构造函数!
如果删除继承语句,请注意继承的已删除构造函数将消失。没有再删除的构造函数。现在,默认编译器生成的默认构造函数会返回,因为删除的构造函数不会覆盖它。
// No deleted constructor: works
NotDerived nd;
NotDerived
类具有编译器生成的默认构造函数,因为它没有从任何东西继承。 Derived
类没有默认的构造函数,它具有删除的构造函数,因为它继承自具有删除的构造函数的类。
因此,正如我们在上述实验中看到的那样,是的,所有在基类中的方法(包括已删除的方法)都继承到派生类中。这意味着基类中的已删除构造函数确实继承了派生类!