C++析構函數加上virtual是為了防止內存泄漏。
用在C++實現多態的時候,其基類要加virtual。
原因跟動態綁定有關,大家都知道,多態是通過虛函數實現的,而虛函數又是通過動態綁定實現的。
先舉個例子:
class Base{ public: virtual void function() { cout<<"this is Base's function"<<endl; } virtual ~Base() { cout<<"this is Base's destroy"<<endl; }};class Derived:public Base{ public: void function() { cout<<"this is Derived's function"<<endl; } ~Derived() { cout<<"this is Derived's destroy"<<endl; }};int main(){ Base *ptr = new Derived(); ptr->function(); delete ptr; return 0;}上面的代碼,我先寫了虛函數function,第31行就是動態綁定,而33行delete刪除的是Base型基類指針,此指針是沒有派生類Derived的析構函數的,所以如果不在基類的析構函數加上virtual的話,就不能動態綁定派生類的析構函數(當然析構函數的動態綁定你可以看出來跟一般函數的動態綁定相比是特殊的,析構函數的虛函數不用按照函數名來找對應的的函數)。一句話:基類的析構函數加了virtual就可以動態綁定派生類的析構函數,這樣的話,在執行多態后刪除其對象,就可以在刪除對象的時候執行派生類的析構函數了(當然執行基類的析構函數是一定會的)。否則不會執行派生類的析構函數。代碼輸出結果:
this is Derived's function
this is Derived's destroy
this is Base's destroy
你可以嘗試一下把基類的析構函數前的virtual刪掉(第9行),輸出結果將是:
this is Derived's function
this is Base's destroy
你可以觀察到,沒有執行派生類的析構函數
新聞熱點
疑難解答
圖片精選