先补下virtual是啥
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
先贴个代码,再解释
#include <iostream> using namespace std; class Base { public: Base(){cout<<"Base Construct"<<endl;}; ~Base(){cout<<"Base destroy"<<endl;} }; class A : public Base { public: A(){cout<<"A Construct"<<endl;} ~A(){cout<<"A destroy"<<endl;} }; class Base1 { public: Base1(){cout<<"Base1 Construct"<<endl;}; virtual ~Base1(){cout<<"Base1 destroy"<<endl;} }; class A1 : public Base1 { public: A1(){cout<<"A1 Construct"<<endl;} ~A1(){cout<<"A1 destroy"<<endl;} }; int main() { Base* p = new A; delete p; cout<<"======================"<<endl; Base1* p1 = new A1; delete p1; return 0; } /* Base Construct A Construct Base destroy ====================== Base1 Construct A1 Construct A1 destroy Base1 destroy */
在代码尾部的注释就是输出。
Base的析构函数没有virtual
Base1的析构函数有virtual
Base* p = new A
delete p
这个过程只调用了Base的析构函数,没有调用A的析构函数。
这样在实际应用中会有不确定的后果,可能会memory leak
应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。
所以要给Base的析构函数以virtual属性。