C++的虛析構詳解及實例代碼。本站提示廣大學習愛好者:(C++的虛析構詳解及實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C++的虛析構詳解及實例代碼正文
投稿:lqh
這篇文章主要介紹了C++的虛析構詳解及實例代碼的相關資料,需要的朋友可以參考下C++的虛析構
最近准備復習一遍所有的知識點,先從基礎開始做起,用幾分鐘寫個繼承和析構吧。
父類為A,子類為B,代碼如下:
class A { public: A() { cout << "構造A"<< endl; } ~A() { cout << "析構A" << endl; } } class B:public A { public: B() { cout << "構造B"<< endl; } ~B() { cout << "析構B"<< endl; } }
這個時候在main函數裡,
定義一個A的對象,A a;運行輸出結果為:構造A 析構A。
定義一個B的對象, B b;運行的輸出結果為:構造B 析構B。
定義一個A的指針,指向B。A *P = new b; 運行輸出結果為:構造A 構造B.這個時候很多人就容易出問題了,為啥沒調用析構呢,這個也是經常遇到的問題,最簡單也是最容易遺忘的。new出來的對象沒有刪,還有寫一行代碼 delete p;這個時候的運行輸出結果為:構造A 構造B 析構A。又出現問題了,B的析構怎麼沒走,這個時候需要一用虛析構這個概念,虛析構的功能:父類的析構寫成虛析構,在刪除父類的指針的時候,可以刪除子類的對象,避免內存洩漏。
具體操作就是把上面代碼的第八行,前面加一個virtual。這個時候再運行輸出結果為:構造A 構造B 析構B 析構A。注意這裡也可以看出調用順序,先走父類的構造,然後子類的構造。先走子類的析構,最後走父類的析構。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!