- 阅读这篇博客之前需要有动多态的概念,可以配合我的上一篇博客共同食用:https://blog.youkuaiyun.com/shaochuang1/article/details/99305833
虚析构函数的应用场景:
当我们在使用多态的时候,需要将基类指针指向new出来的派生类对象,在使用结束后,需要delete这个指针时就会出现问题。由于这个指针是基类指针,delete这个指针也只会触发基类的析构函数,然而这个指针指向的确实派生类对象实体,这个时候就会出现对象析构不彻底的问题。
解决方案:
解决上述问题的方法就是,将基类的析构函数设置为虚析构函数。用delete去释放一个具有虚析构函数的对象时,会产生动态关联,即通过对象实体的虚指针,来找到虚表中对应的析构函数。用这种方法找到的析构函数就是派生类的析构函数,而派生类的析构函数会触发基类的析构函数,这样就将这个对象彻底释放啦!
注意:
- 如果我们将一个基类的析构函数设计为虚析构函数,那么由这个基类派生出来的所有派生类的析构函数都将是虚析构函数,不用virtual关键字来限定也可以,即便是,函数名不同。
- 因此,对于包含虚函数的基类,最好将也将析构函数设置为虚析构函数。
非虚析构函数代码示例:
#include<iostream>
using namespace std;
class Shape{
public:
virtual void draw(){
cout << "这是一个空函数" << endl;
}
~Shape(){
cout << "调用Shape析构函数" << endl;
}
};
class Triangle : public Shape{
p