诸如NonCopyable和NonMovable之类的接口应该提供虚拟析构函数吗

Should interfaces such as NonCopyable and NonMovable provide virtual destructors?

本文关键字:虚拟 析构函数 接口 NonCopyable NonMovable 诸如      更新时间:2023-10-16

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