天天看點

構造函數和析構函數是否應該為虛函數構造函數析構函數

構造函數

構造函數不能是虛函數。因為建立派生類的對象時,将調用派生類的構造函數,而不是基類的構造函數,然後,派生類的構造函數将使用基類的一個構造函數,這種順序不同于繼承機制。是以,派生類不繼承基類的構造函數,是以将類構造函數聲明為虛的沒什麼意義。

析構函數

析構函數應該是虛函數,除非類不用做基類。例如當E為基類,S是派生類,并添加一個char*成員,該成員指向由new配置設定的記憶體。當S對象過期的時候,必須調用S的析構函數來釋放記憶體。

如下代碼将會解釋為什麼,析構函數應當是虛函數:

E pe = new S;
delete pe;
           

如果在上述代碼中,E中定義的析構函數不是虛函數,那麼在第二行delete的時候就隻會調用E類的析構函數,那麼S中的char*成員所配置設定的記憶體将得不到釋放。是以要把析構函數聲明為虛函數。當将其聲明為虛函數時,在上述代碼中,先調用S的析構函數釋放S元件所指向的記憶體,然後調用E析構函數來釋放由R元件指向的記憶體。

一般情況下應給基類提供一個虛析構函數,即使它不作為基類或者并不需要析構函數。

繼續閱讀