诸如NonCopyable和NonMovable之类的接口应该提供虚拟析构函数吗
Should interfaces such as NonCopyable and NonMovable provide virtual destructors?
像NonCopyable和NonMovable这样的接口是否应该提供虚拟析构函数,并且只声明析构函数受保护?
我无法想象有人想要将对象存储为不可复制/不可移动,并以这样的多态方式使用它们。
任何不可复制的基都不需要虚拟析构函数。但是,是的,扩展这个不可复制的类可能需要虚拟析构函数。
如果您正在使用boost,您可以从noncopyable.hpp 继承
使用C++11,您可以删除构造函数和析构函数,从而使许多不可复制/不可移动的习惯用法过时:
YourClass() = delete; /*deletion of default constructor*/
YourClass(const YourClass&) = delete; /*deletion of copy constructor*/
~YourClass() = delete; /*deletion of the destructor of YourClass*/
等等。如果任何代码需要这些,您将在编译时失败。
不可复制和不可移动的特征是相互正交的,并且是多态使用的
那么,为什么不应该有人想在任何组合中混合搭配呢?
无论如何,避免这个问题的正确方法是声明这些类为destructor protected,并且只继承它们为private。尼尔·柯克说得对。
此外,由于C++11,您可以显式声明任何想要删除的函数,这是首选方式。
相关文章:
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 程序永远不会进入虚拟析构函数
- C++ std::vector 中的虚拟析构函数继承
- 哪种方法更适合处理虚拟析构函数?
- 拥有"受保护的非虚拟析构函数"与"受保护虚拟析构构函数"有什么好处
- 带有未解析外部元素的C++虚拟析构函数
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++切片和虚拟析构函数
- C++虚拟继承、虚拟析构函数和 dynamic_cast<void*>
- 添加虚拟析构函数会使代码大小膨胀
- 应该是虚拟析构函数吗?但是怎么做呢?
- 虚拟析构函数将对象移出 rodata 部分
- 如何将 std::unique_ptr<Parent> 与具有受保护虚拟析构函数的只读父类一起使用
- DIRECTX9 中自定义顶点的虚拟析构函数
- 为什么缺少虚拟析构函数不会导致内存泄漏?
- std::unique_ptr 在虚拟析构函数上重置 SIGABRT
- C++11 中默认纯虚拟析构函数的正确放置
- 在派生类中重写哪个基类的虚拟析构函数