首先,對於虛析構函式,那就得說下建構函式和析構函式了。
建構函式:進行初始化成員變數的函式。
析構函式:在物件生命週期結束的時候,完成資源的**和清理。
如果我們在設計乙個類的時候,沒有顯示宣告定義建構函式,析構函式,則編譯器會自動生成。
虛析構函式:只有當乙個類被定義為基類的時候,才會把析構函式寫成虛析構函式。
如果我們不需要使用基類對派生類的物件操作時,我們也不必去定義虛析構函式,這樣會增加系統的記憶體開銷,當類裡面有虛析構函式時,系統會為當前類分配乙個虛函式表,裡面存放虛函式指標,這樣就會增加類的儲存空間。關於虛函式表的一些知識,可以訪問: 。
對於虛析構,就是在析構函式前加virtual關鍵字,那麼到底有什麼作用呢?
防止記憶體洩露,定義乙個基類的指標p,在delete p時,如果基類的析構函式是虛函式,這時只會看p所賦值的物件,如果p賦值的物件是派生類的物件,就會呼叫派生類的析構函式(毫無疑問,在這之前也會先呼叫基類的建構函式,在呼叫派生類的建構函式,然後呼叫派生類的析構函式,基類的析構函式,所謂先構造的後釋放);如果p賦值的物件是基類的物件,就會呼叫基類的析構函式,這樣就不會造成記憶體洩露。
如果基類的析構函式不是虛函式,在delete p時,呼叫析構函式時,只會看指標的資料型別,而不會去看賦值的物件,這樣就會造成記憶體洩露。
下面是具體的**演示:
仔細對比上面兩個**的執行結果,我們就不難得出上面的結論了。
所以我們程式設計時候切記在析構函式前加virtual關鍵字。
最後,文章如果有瑕疵的地方,請大神指出。
虛析構函式 純虛析構函式 理解
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生 部分不會被銷毀。...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...