1. 程式人生 > >向上引用時new建立的物件的析構

向上引用時new建立的物件的析構

假設Employee是基類,Singer是派生類,並新增一個char*成員,該成員指向有new分配的記憶體。

下面的程式碼:

Employee *pe = new Singer;
delete pe;

如果使用預設的靜態編譯,delete語句將呼叫~Employee()解構函式。這將釋放由Singer物件中的Employee部分指向的記憶體,但不會釋放新的類成員指向的記憶體。

但如果解構函式是虛的,則上述程式碼將先呼叫~Singer解構函式釋放由Singer元件指向的記憶體,然後呼叫~Employee()解構函式來釋放由Employee元件指向的記憶體。

這意味著,即使基類不需要顯示解構函式提供服務,也不應依賴於預設建構函式,而應提供虛解構函式,即使它不執行任何操作:

virtual ~BaseClass(){}

順便說一句,給類定義一個虛解構函式並非錯誤,即使這個類不作基類;這只是一個效率方面的問題。

 

提示:通常應該給基類提供一個虛解構函式,即使它並不需要解構函式。可以為以後拓展類組合繼承打下基礎。