Uma interface c ++ deve obedecer à regra dos cinco?
Qual é a maneira correta de declarar métodos de instanciação ao definir uma classe de interface?
As classes base abstratas são necessárias para ter um destruidor virtual por razões óbvias. No entanto, o seguinte aviso de compilação é fornecido: "'InterfaceClass' define um destruidor não padrão, mas não define um construtor de cópias, um operador de atribuição de cópias, um construtor de movimentação ou um operador de atribuição de movimentação", que é a regra dos cinco '
Entendo por que a 'regra dos cinco' deve ser obedecida em geral, mas ainda é aplicável a uma classe ou interface base abstrata?
Minha implementação é então:
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()
{
}
Isso está correto? Esses métodos devem ser= delete
em vez de? Existe alguma maneira de declarar o destruidor como virtual puro e, de alguma forma, permanecer o padrão?
Mesmo se eu declarar o destruidor como:virtual ~InterfaceClass() = default;
, se eu não definir explicitamente os outros quatro, receberei o mesmo aviso do compilador.
Tl; dr: Qual é a maneira correta de satisfazer a 'regra dos cinco' para uma classe de interface, pois o usuário deve definir um destruidor virtual.
Obrigado pelo seu tempo e ajuda!