您好,登錄后才能下訂單哦!
C++中如何使用虛析構函數,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
C++的多態性是通過虛函數來實現的,虛函數的出現使得動態鏈接成為可能。
基于構造函數的特點,不能將構造函數定義為虛函數,但可以將析構函數定義為虛函數。當派生類的對象從內存中撤銷時,會先調用派生類的析構函數,然后自動調用基類的析構函數,如此看來析構函數也沒有必要定義為虛函數。
但是考慮如下這種情況,如果使用基類指針指向派生類的對象,而這個派生類對象恰好是用new運算創建的,這種情況下會如何呢?當程序使用delete運算撤銷派生類對象時,這時只會調用基類的析構函數,而沒有調用派生類的析構函數。如果使用的是虛析構函數的話,就不一樣了,所以定義虛析構函數有時候還是很有必要的。下面這段程序就說明了上面的問題:
沒有定義虛C++虛析構函數時,code如下:
#include < iostream> using namespace std; class A { public: A(){} ~A() { cout< < "A::destructor"< < endl; } }; class B:public A { public: B(){} ~B() { cout< < "B::destructor"< < endl; } }; int main() { A *pA = new B; // delete pA; return 0; }
輸出的是A::destructor
這說明delete pA只是調用了基類A的析構函數,而沒有調用子類B的析構函數,這不是我們所想要的。而把基類A的析構函數定義為虛函數后,就可以達到了我們所想要的效果了。code如下:
#include < iostream> using namespace std; class A { public: A(){} virtual ~A() { cout< < "A::destructor"< < endl; } }; class B:public A { public: B(){} ~B() { cout< < "B::destructor"< < endl; } }; int main() { A *pA = new B; // delete pA; return 0; }
輸出如下:
B::destrutor
A::destrutor
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。