2011-10-28 84 views
2

如果我有以下3個類來隱藏數據類型和存儲信息,我需要一個虛擬析構函數嗎?我被引導不相信,但現在我不確定。 如果可能的話,我寧願不包括它,因爲性能原因。爲了例子清除類。使用隱形模式時需要虛擬析構函數嗎?

#include <memory> 

class DarkHideInterface 
{ 
    public: 
    bool test; 

}; 


template <typename T> 
class DarkHideInterfaceImpl : public DarkHideInterface 
{ 
    public: 
    DarkHideInterfaceImpl (const T& t) : _t(t) {} 

    private: 
    T _t; 
}; 


class DarkHide 
{ 
    public: 
    template <class T> DarkHide (const T& t) : p_(new DarkHideInterfaceImpl<T>(t)) { } 

    private: 
    std::auto_ptr<DarkHideInterface> p_; 
}; 

回答

2

隨着auto_ptr,我認爲你需要虛擬析構函數,因爲delete將多態發生 - 換句話說,內部auto_ptr最終將呼籲存儲DarkHideInterface*delete。如果DarkHideInterface沒有虛擬析構函數,並且指針指向DarkHideInterfaceImpl實例,那麼您會得到未定義的行爲。據我所知,你不需要虛擬析構函數,因爲它記住了它所構造的指針的類型,並直接調用delete(在這裏搜索'虛析構函數'看看我的意思是:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm)。

+0

謝謝,這對我有意義。我想知道新的0x標準中的unique_ptr是否會以相同的方式工作。 – bjackfly

相關問題