构造函数和析构函数继承

时间:2011-11-12 10:10:55

标签: c++ inheritance derived-class base-class

我相信Constructors中的Destructorsbase class不能由基类的derived classes继承。我的理解是否正确。

5 个答案:

答案 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)

不,他们是继承的。例如,析构函数总是被继承并以与创建相反的顺序调用。例如,如果我们有类foobarxyzzy

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所解释的那样,构造函数不是继承的。这同样适用于析构函数。