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_; 
};
4

1 に答える 1

2

では、多態的に発生auto_ptrするため、仮想デストラクタが必要だと思います。deleteつまり、内部auto_ptr的に最終的deleteに格納されDarkHideInterface*た . DarkHideInterface仮想デストラクタがなく、ポインタがインスタンスを指している場合DarkHideInterfaceImpl、未定義の動作が発生します。

shared_ptr私の知る限り、仮想デストラクタは必要ないことに注意してください。これは、構築されたポインタのタイプを記憶し、deleteそのポインタを直接呼び出すためです(ここで「仮想デストラクタ」を検索して、意味を確認してください:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm )。

于 2011-10-28T01:38:30.747 に答える