是否使用派生类调用基类的构造函数和析构函数?

jos*_*erk 12 c++

我有一个名为MyBase的类,它有一个构造函数和析构函数:

class MyBase
{
public:
    MyBase(void);
    ~MyBase(void);
};
Run Code Online (Sandbox Code Playgroud)

我有一个名为Banana的类,它扩展了MyBase,如下所示:

class Banana:public MyBase
{
public:
    Banana(void);
    ~Banana(void);
};
Run Code Online (Sandbox Code Playgroud)

Banana中新构造函数和析构函数的实现是否覆盖了MyBase,或者它们是否仍然存在,并且在Banana构造函数/析构函数执行之前或之后被调用?

谢谢,如果我的问题看起来很愚蠢,我很抱歉.

Ark*_*nez 17

始终在派生构造函数之前调用Base构造函数.将在Dervided析构函数之后调用Base析构函数.

您可以在派生构造函数上指定所需的Base构造函数,如果不是,则将执行默认构造函数.

如果您定义其他构造函数但不是默认值,并且未在Derived构造函数上指定要执行哪个构造函数,那么请尝试使用不存在的默认值,这将导致编译崩溃.

发生以上情况是因为一旦声明了一个构造函数,就不会生成默认构造函数.


Meh*_*ari 8

构造函数不能被覆盖.您不能在派生类中声明基类构造函数.类构造函数必须在其他任何内容之前调用基类中的构造函数(如果未明确声明,则调用默认构造函数).

为了能够正确地清理派生类,您应该将基类析构函数声明为virtual:

virtual ~MyBase() { ... }
Run Code Online (Sandbox Code Playgroud)

  • 析构函数不会真正被覆盖.virtual关键字在虚方法表中创建一个条目,这样即使通过指向基类的指针删除,也会首先调用派生最多的析构函数.但是在最派生的析构函数完成之后,将调用所有base的析构函数.也就是说,它不会覆盖,只是保证最派生的析构函数在所有情况下都会调用. (4认同)

Gyö*_*sek 6

应该说

class Banana : public MyBase
{
public:
    Banana(void);
    ~Banana(void);
};
Run Code Online (Sandbox Code Playgroud)

派生类的构造函数在基类的构造函数之后被调用.析构函数以相反的顺序被调用.