2011-10-28 12 views
2

データ型を隠して情報を格納する次の3つのクラスがある場合、 仮想デストラクタが必要ですか?私はいいえを信じるように導かれましたが、今はわかりません。 可能な場合は、事前の成果のために私はむしろそれを含めません。クラスは、例えば酒のために取り除かれました。 auto_ptrクローキングパターンを使用する場合は仮想デストラクタが必要ですか?

#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

、私はdeleteはポリモーフィック起こりますので、あなたは、仮想デストラクタが必要だと思う - つまり、内部auto_ptrが最終的に保存されDarkHideInterface*deleteを呼び出します。 DarkHideInterfaceに仮想デストラクタがなく、ポインタがDarkHideInterfaceImplインスタンスを指している場合、未定義の動作が発生します。それはそれを構築し、直接そのポインタにdeleteを呼び出したとポインタの型を覚えているので、あなたは、私の知る限りshared_ptrで仮想デストラクタを必要としない

注(ここでは「仮想デストラクタ」を検索します私が何を意味するかを見る:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm)。

+0

ありがとう、これは私にとって意味があります。新しい0x標準のunique_ptrが同じように動作するかどうか疑問に思っていました。 – bjackfly

関連する問題