一、析构函数可以是虚析构函数
假如基类的析构函数不可以是虚函数,那么用基类指针或者引用指向派生类型时,就只会调用基类的析构函数,一直调用不到的是派生类对象的析构函数,导致内存泄漏。所以,将析构函数声明为虚函数是十分有必要的。
二、构造函数不能为虚函数
1、从存储空间角度
虚函数的执行依赖于虚函数表,而虚函数表是在构造函数中初始化的,即初始化虚表指针(vptr),让它指向虚函数表。可是虚表指针是存储在对象的内存空间的,它是一个对外不可见的类成员变量*__vptr。如果构造函数是虚函数,就需要通过虚表指针来调用,而对象还没有实例化,内存空间都还没有分配,该成员变量也无法初始化,这就无法找到虚函数表,所以构造函数不能是虚函数。
2、从使用角度
虚函数的作用是在程序运行时,是通过父类的指针或者引用来调用子类的那个成员函数,而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用。假设我们是要创建该对象,难道要先实例化一个父类对象,再去调用所谓的这个虚构造函数?逻辑不合理,创建对象应该直接调用该对象的构造函数即可,所以构造函数不能,也不该是虚函数。
参考: