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。注意這里也可以看出調用順序,先走父類的構造,然后子類的構造。先走子類的析構,最后走父類的析構。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答
圖片精選