Виртуальный деструктор нужен при использовании маскировки? - PullRequest
2 голосов
/ 28 октября 2011

Если у меня есть следующие 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_; 
};

1 Ответ

2 голосов
/ 28 октября 2011

С auto_ptr, я думаю, вам нужен виртуальный деструктор, так как delete произойдет полиморфно - другими словами, внутренне auto_ptr в конечном итоге вызовет delete в сохраненном DarkHideInterface*. Если DarkHideInterface не имеет виртуального деструктора и указатель указывает на экземпляр DarkHideInterfaceImpl, то вы получите неопределенное поведение.

Обратите внимание, что вам не понадобится виртуальный деструктор с shared_ptr, насколько я знаю, потому что он запоминает тип указателя, с которым он был создан, и вызывает delete для этого указателя напрямую (ищите 'virtual деструктор ", чтобы увидеть, что я имею в виду: http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...