使用隐形模式时需要虚拟析构函数

Virtual Destructor needed when using Cloaking pattern?

本文关键字:虚拟 析构函数 隐形 模式      更新时间:2023-10-16

如果我有以下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_; 
};

对于auto_ptr,我认为您需要虚拟析构函数,因为delete将以多态方式发生-换句话说,内部auto_ptr最终将在存储的DarkHideInterface*上调用delete。如果DarkHideInterface没有虚析构函数,并且指针指向DarkHideInterfaceImpl实例,则会得到未定义行为。

请注意,据我所知,您不需要使用shared_ptr的虚拟析构函数,因为它记住了构建它的指针的类型,并直接在该指针上调用delete(在这里搜索'virtual destructor'以了解我的意思:http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm)。