在定义接口类时,声明实例化方法的正确方式是什么?
显而易见,抽象基类需要具有虚析构函数。但是,接下来会出现以下编译警告:“‘InterfaceClass’定义了一个非默认析构函数,但没有定义复制构造函数、复制赋值运算符、移动构造函数或移动赋值运算符”,这就是‘五法则’。
我理解为什么通常应该遵守‘五法则’,但对于抽象基类或接口是否仍然适用呢?
我的实现如下:
class InterfaceClass
{
// == INSTANTIATION ==
protected:
// -- Constructors --
InterfaceClass() = default;
InterfaceClass(const InterfaceClass&) = default;
InterfaceClass(InterfaceClass&&) = default;
public:
// -- Destructors --
virtual ~InterfaceClass() = 0;
// == OPERATORS ==
protected:
// -- Assignment --
InterfaceClass& operator=(const InterfaceClass&) = default;
InterfaceClass& operator=(InterfaceClass&&) = default;
// == METHODS ==
public:
// Some pure interface methods here...
};
// == INSTANTIATION ==
// -- Destructors --
InterfaceClass::~InterfaceClass()
{
}
这是否正确?这些方法应该是= delete
吗?有没有办法声明析构函数为虚拟纯函数,同时仍然保持默认值?
即使我将析构函数声明为:virtual ~InterfaceClass() = default;
,如果我不明确地将其他四个函数设置为默认值,则会收到相同的编译器警告。
Tl; dr:满足接口类的“五法则”正确方式是什么,因为用户必须定义虚拟析构函数。
感谢您的时间和帮助!
struct C { ~C()=0; }; C::~C() = default;
因为它将被派生类的析构函数调用。未定义的纯虚析构函数将导致链接错误。 - Oktalist