Виртуальный деструктор необходим при использовании шаблона маскировки?

#c #virtual-destructor #cloaking

#c #виртуальный деструктор #маскировка

Вопрос:

Если у меня есть следующие 3 класса для скрытия типа данных и хранения информации, нужен ли мне виртуальный деструктор? Меня заставили поверить, что нет, но теперь я не уверен. Я бы предпочел не включать его, если это возможно, по соображениям предварительной подготовки. Классы урезаны, например, ради.

 #include <memory>

class DarkHideInterface
{
  public:
  bool test;

};


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

  private: 
  T _t; 
};


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

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

Ответ №1:

С 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 ).

Комментарии:

1. спасибо, для меня это имеет смысл. мне было интересно, будет ли unique_ptr в новом стандарте 0x работать так же.