构造函数:
构造函数不可以是虚函数。
当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表用于存储虚成员函数指针。
当存在虚函数时,每个对象都有一个指向虚函数表的指针vptr,该指针存放在对象的内部空间中,需要调用构造函数完成初始化。
如果构造函数是虚函数,那么调用构造函数就需要先找vptr,但此时vptr还没初始化,发生冲突。
析构函数:
析构函数可以是虚函数。
虚表vtable以及初始化,所以完全可以将析构函数放到虚表中。
当类有继承时,析构函数必须是虚函数。
如果不是虚函数,那么可能导致内存泄漏。
基类指针指向子类,如果析构函数不是虚函数,那么delete的时候只会释放基类,不释放子类,造成内存泄漏。