臨界區(qū)與互斥量的區(qū)別 為什么基類的析構(gòu)函數(shù)定義為虛函數(shù)?
為什么基類的析構(gòu)函數(shù)定義為虛函數(shù)?我們經(jīng)常使用基類指針指向派生類對象,然后通過delete基類指針刪除派生類對象。此時,為了確保派生類對象可以被完全析構(gòu)函數(shù),我們自然需要基類析構(gòu)函數(shù)是一個虛函數(shù)。這樣
為什么基類的析構(gòu)函數(shù)定義為虛函數(shù)?
我們經(jīng)常使用基類指針指向派生類對象,然后通過delete基類指針刪除派生類對象。此時,為了確保派生類對象可以被完全析構(gòu)函數(shù),我們自然需要基類析構(gòu)函數(shù)是一個虛函數(shù)。這樣,在刪除的時候會調(diào)用派生類析構(gòu)函數(shù),否則只調(diào)用基類析構(gòu)函數(shù),派生類不能完全析構(gòu)函數(shù)出來的部分。
析構(gòu)函數(shù)為什么是虛函數(shù)?
使用delete PA指向基類引用時,釋放PA引用的內(nèi)存,PA引用B object,為什么不調(diào)用B的析構(gòu)函數(shù)呢?這里,由于是靜態(tài)綁定,當(dāng)B在編譯時確定了它指向的函數(shù)時,它不會根據(jù)對象a來確定它指向的函數(shù),這樣,如果B申請內(nèi)存資源,但不釋放析構(gòu)函數(shù)中的資源,就會導(dǎo)致內(nèi)存泄漏。
仔細(xì)想想,這不是虛擬功能的原因嗎?
添加了虛擬機制。編譯時,虛擬機會自動將方法指向B的地址,通過設(shè)置機制可以找到B的析構(gòu)函數(shù)。
為了改變這一點,有一個虛擬析構(gòu)函數(shù)
只要基類的析構(gòu)函數(shù)設(shè)置為virtual type,所有派生類都會自動將析構(gòu)函數(shù)設(shè)置為virtual type,以確保不會因為沒有調(diào)用析構(gòu)函數(shù)而導(dǎo)致內(nèi)存泄漏。