构造与析构的顺序问题与C++中虚函数之间的联系

构造

  1. 基类的成员对象的构造函数
  2. 基类的构造函数
  3. 子类的成员对象的构造函数
  4. 子类的构造函数

析构

  1. 子类的成员对象的析构函数
  2. 子类的析构函数
  3. 基类的成员对象的析构函数
  4. 基类的析构函数

由上可推测,在C++中调用基类指针创建子类对象时,由于析构函数会优先调用基类指针所指的基类析构函数,但是内存中创建的是子类对象,因此当销毁时会导致使用基类析构函数去析构子类对象,进而发生不确定错误。

总结一下,就是C++中当基类指针要求被销毁时,其析构函数要作为虚析构函数;其余情况一般不作为虚函数——虚函数需要占用额外的内存用来分配虚函数表。

因此,原则就是基类的析构函数要作为虚析构函数;其余析构函数就作为普通析构函数即可。

除此以外,构造函数一定不能是虚函数。构造函数必须明确类的初始化细节,而不是抽象的进行声明。

posted @ 2022-01-08 14:49  Kisen  阅读(54)  评论(0)    收藏  举报