构造函数和析构函数继承

Constructor and Destructor Inheritance

本文关键字:继承 析构函数 构造函数      更新时间:2023-10-16

我认为base class中的ConstructorsDestructors不能被基类的derived classes继承。

你的理解是正确的。例如,如果您有

class Base
{
  Base(int i) {}
};
class Derived: public Base {};
Derived d(3);

这将无法编译,因为Base构造函数没有被继承。请注意,如果可能的话,默认构造函数和复制构造函数是由编译器创建的,并调用基类的相应构造函数,因此对于这些构造函数,看起来就好像是继承的。

我想这就是你要找的?可以通过在类构造函数

中添加以下代码来调用超类构造函数
SubClass(int foo, int bar)
    : SuperClass(foo)
一个完整的例子可以在这里找到调用超类构造函数的规则是什么?

相反,派生类的每个构造函数调用基[超]类的一个构造函数。派生类的每个析构函数都在基类[超]类的析构函数之前调用。

继承关系到类,而不是函数或构造函数。

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

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)而不是默认构造函数

正如这个问题所解释的,构造函数不能被继承。