注意:虚函数的本质就是通过基类访问派生类定义的函数!
将基类的析构函数定义为虚函数场景:
基类指针指向派生类,并且调用delete释放基类指针的空间时,如果不把基类的析构函数定义为虚函数,则只会调用基类的析构函数,而派生类部分没有调用析构函数,会造成内存泄露;下面程序的运行结构为:
executing Point destructor
#include <iostream>
using namespace std;
class Point //定义基类Point类
{
public:
Point( ){} //Point类构造函数
~Point(){cout<<"executing Point destructor"<<endl;} //Point类析构函数
};
class Circle:public Point //定义派生类Circle类
{
public:
Circle( ){} //Circle类构造函数
~Circle( ){cout<<"executing Circle destructor"<<endl;} //Circle类析构函数
private:
int radius;
};
int main( )
{
Point *p=new Circle; //用new开辟动态存储空间
delete p; //用delete释放动态存储空间
return 0;
}
如果把基类的析构函数定义为虚函数,则会先调用派生类的虚构该函数再调用基类的析构函数!
总结
如果基类的析构函数被定义为虚函数,由基类派生的所有派生类的析构函数都自动成为虚函数,即便是派生类的析构函数名字与基类的析构函数名字不同!