我相信Constructors
中的Destructors
和base class
不能由基类的derived classes
继承。我的理解是否正确。
答案 0 :(得分:5)
您的理解是正确的。例如,如果你有
class Base
{
Base(int i) {}
};
class Derived: public Base {};
Derived d(3);
这将无法编译,因为Base构造函数未被继承。 请注意,如果可能,默认和复制构造函数由编译器创建,并调用相应的基类构造函数,因此对于那些构造函数,它看起来像,就好像那些是继承的。
答案 1 :(得分:1)
我认为这就是你要找的东西?您可以通过将以下内容添加到类构造函数
来调用超类构造函数SubClass(int foo, int bar)
: SuperClass(foo)
可在此处找到完整示例What are the rules for calling the superclass constructor?
答案 2 :(得分:0)
相反,派生类的每个构造函数都调用base [super-]类的构造函数。派生类的每个析构函数都在base [super-]类的析构函数之前调用。
继承涉及类,而不是函数或构造函数。
答案 3 :(得分:0)
不,他们是继承的。例如,析构函数总是被继承并以与创建相反的顺序调用。例如,如果我们有类foo
,bar
和xyzzy
:
class foo { ... };
class bar : public foo { ... };
class xyzzy : public bar { ... };
然后,如果你去了类xyzzy
的对象,将按以下顺序调用析构函数:~xyzzy()
,~bar()
和最后~foo()
。
构造函数也总是被继承,但不能直接调用它们。你必须在构造函数初始化列表中使用它们,否则将调用默认构造函数(默认构造函数是不带参数的构造函数)。例如,假设我们有以下类:
class foo {
public:
foo();
foo (int _value);
}
class bar : public foo {
int m_value;
public:
bar (int _value);
}
bar::bar (int _value)
{
m_value = _value;
}
在这种情况下,当您创建类bar
的对象时,会调用foo
的构造函数,但它是默认构造函数(foo()
)。从不调用带参数foo (int _value)
的构造函数。但是,如果我们将bar (int _value)
构造函数的定义更改为:
bar::bar (int _value)
: foo (256 - _value), m_value (_value)
{
}
然后,将调用foo (int _value)
而不是默认构造函数。
答案 4 :(得分:0)
正如this question所解释的那样,构造函数不是继承的。这同样适用于析构函数。