使用隐形模式时需要虚拟析构函数
Virtual Destructor needed when using Cloaking pattern?
如果我有以下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)。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数