NonCopyable和NonMovable等接口是否应该提供虚拟析构函数,只是声明析构函数受保护?
我无法想象有人想要将对象存储为NonCopyable / NonMovable并以多态方式使用它们。
答案 0 :(得分:2)
没有非可复制的基础不需要虚拟析构函数。但是,扩展这个不可复制的类可能需要虚拟析构函数。
如果您使用的是boost,则可以继承noncopyable.hpp
答案 1 :(得分:1)
使用C ++ 11,您可以删除构造函数和析构函数,使许多NonCopyable / NonMovable习语过时:
YourClass() = delete; /*deletion of default constructor*/
YourClass(const YourClass&) = delete; /*deletion of copy constructor*/
~YourClass() = delete; /*deletion of the destructor of YourClass*/
等。如果任何代码需要这些,则会导致编译时失败。
答案 2 :(得分:0)
特征NonCopyable和NonMovable彼此正交并且与多态使用相互作用 那么为什么不想有人想要任何组合混合搭配呢?
无论如何,避免这个问题的正确方法是声明那些析构函数受保护的类,并且只将它们私有化。尼尔柯克说得对。
此外,从C ++ 11开始,您可以显式声明要删除的任何函数,这是首选方法。