作者:isonlyk | 来源:互联网 | 2023-10-13 11:43
如果基类的析构函数不是虚函数,在特定情况下会导致派生来无法被析构。
情况1:用派生类类型指针绑定派生类实例,析构的时候,不管基类析构函数是不是虚函数,都会正常析构
情况2:用基类类型指针绑定派生类实例,析构的时候,如果基类析构函数不是虚函数,则只会析构基类,不会析构派生类对象,从而造成内存泄漏。为什么会出现这种现象呢,个人认为析构的时候如果没有虚函数的动态绑定功能,就只根据指针的类型来进行的,而不是根据指针绑定的对象来进行,所以只是调用了基类的析构函数;如果基类的析构函数是虚函数,则析构的时候就要根据指针绑定的对象来调用对应的析构函数了。
上一篇文章说到,虚函数在派生类和基类中需要函数名字和参数表都相同,但是这里的虚析构函数显然在每个类中是不一样的,可能是析构函数比较特殊吧。另外构造函数不可以是虚函数,为什么呢,因为类的虚函数表指针是在构造函数中初始化的,这时候入股构造函数本身是虚函数,又应该有谁来初始化它的虚函数指针呢,所以构造函数不能是虚函数。构造函数和析构函数中也不能调用虚函数,调用了也没用,一个是虚函数表指针还没有初始化好,一个是可能虚函数指针已经被析构了。
原文链接:https://blog.csdn.net/weixin_30953735/article/details/82633999