#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 работать так же.