我有一个名为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构造函数上指定要执行哪个构造函数,那么请尝试使用不存在的默认值,这将导致编译崩溃.
发生以上情况是因为一旦声明了一个构造函数,就不会生成默认构造函数.
构造函数不能被覆盖.您不能在派生类中声明基类构造函数.类构造函数必须在其他任何内容之前调用基类中的构造函数(如果未明确声明,则调用默认构造函数).
为了能够正确地清理派生类,您应该将基类析构函数声明为virtual
:
virtual ~MyBase() { ... }
Run Code Online (Sandbox Code Playgroud)
应该说
class Banana : public MyBase
{
public:
Banana(void);
~Banana(void);
};
Run Code Online (Sandbox Code Playgroud)
派生类的构造函数在基类的构造函数之后被调用.析构函数以相反的顺序被调用.