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!

questionAnswers(3)

yourAnswerToTheQuestion