先補下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屬性。