构造函数不可以为虚函数,主要从两个方面论证
-
从结构上来说,如果类中有虚函数,会在构造函数的时候初始化虚函数表,但虚函数的执行却需要虚函数表,如果构造函数是虚函数,那么就得先有虚函数表才能使用虚函数,但只有构造函数执行的时候才会生成虚函数表,所以两者的关系矛盾了
-
从意义上来讲,构造函数本身就是为了在编译期间确定对象的类型以及为对象分配空间,而虚函数的意义是为了在动态运行期间才确定类型,
析构函数可以为虚函数,从多态方面论证
- 当一个派生类继承了一个基类且有虚函数的情况下,我们可以通过一个基类的指针或者引用指向派生类的对象,来实现调用派生类对象的虚函数
- 当结束程序时,应该要释放指针指向的内存空间,所以得调用析构函数,如果析构函数为虚函数的话,就可以通过基类的指针调用到派生类的析构函数,而派生类的析构函数执行后会调用基类的析构函数,这样就能完全释放。而如果析构函数不是虚函数,那么只会调用基类的析构函数,无法调用派生类的,就会造成内存泄漏