定义接口类时声明实例化方法的正确方法是什么?
出于显而易见的原因,抽象基类必须具有虚拟析构函数。但是,随后给出以下编译警告:“'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:当用户必须定义一个虚拟析构函数时,满足接口类“五规则”的正确方法是什么。
感谢您的时间和帮助!