如果我有以下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_;
};
答案 0 :(得分: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)。