在C++的多态和继承机制中,需要了解派生类在实例化过程中的一般步骤:

先分配基类的数据成员空间并运行基类的构造函数,再分配派生类的数据成员空间并运行派生类的构造函数。

于是有:派生类在构造时就可以使用继承而来的基类成员。
同时也要注意:基类在构造时无法使用派生类的成员,基类甚至不知道被哪些类派生。

由此可知基类在构造时定义于该类中的纯虚函数并没有被实现,自然就无法在构造函数中调用了。其它虚函数也同理。

反过来在销毁对象时就是先销毁派生类对象的内存再销毁基类对象。因为要确保派生类在析构时能使用基类的成员。

这里还涉及到析构函数调用及基类的虚析构函数的问题。

正常情况下,析构派生类对象时派生类会在自身的析构函数执行完成时自动调用基类的析构函数。
但是当用一个基类的指针指向派生类对象,并直接删除该指针时,会产生两种情况:

  • 基类的析构函数声明为虚函数,则替换成相应的派生类析构函数并调用,与销毁派生类对象时一样;
  • 基类的析构函数未声明为虚函数,则会直接调用该基类的析构函数,派生类的析构函数不会被执行。

所以一个类被设计为基类后,其析构函数也应声明为虚函数。构造函数无法成为虚函数。

class Base
{
    Base();
    virtual ~Base();
};