NonCopyable和NonMovable等接口是否应提供虚拟析构函数?

时间:2014-04-14 13:53:16

标签: c++

NonCopyable和NonMovable等接口是否应该提供虚拟析构函数,只是声明析构函数受保护?

我无法想象有人想要将对象存储为NonCopyable / NonMovable并以多态方式使用它们。

3 个答案:

答案 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开始,您可以显式声明要删除的任何函数,这是首选方法。