天天看點

為什麼構造函數不能為虛函數,而析構函數可以為虛函數?

1. 為什麼構造函數不能為虛函數?     虛函數的調用需要虛函數表指針,而該指針存放在對象的内容空間中;若構造函數聲明為虛函數,那麼由于對象還未建立,還沒有記憶體空間,更沒有虛函數表位址用來調用虛函數——構造函數了。

2. 為什麼析構函數可以為虛函數,如果不設為虛函數可能會存在什麼問題?     首先析構函數可以為虛函數,而且當要使用基類指針或引用調用子類時,最好将基類的析構函數聲明為虛函數,否則可以存在記憶體洩露的問題。     舉例說明:     子類B繼承自基類A; A *p = newB; delete p;     1)此時,如果類A的析構函數不是虛函數,那麼deletep; 将會僅僅調用A的析構函數,隻釋放了B對象中的A部分,而派生出的新的部分未釋放掉。     2) 如果類A的析構函數是虛函數,deletep; 将會先調用B的析構函數,再調用A的析構函數,釋放B對象的所有空間。     補充: B *p = new B; deletep;時也是先調用B的析構函數,再調用A的析構函數。

c++

繼續閱讀