¿Debe una interfaz de C ++ obedecer la regla de cinco?

¿Cuál es la forma correcta de declarar métodos de instanciación al definir una clase de interfaz?

Se requiere que las clases base abstractas tengan un destructor virtual por razones obvias. Sin embargo, se da la siguiente advertencia de compilación: "'InterfaceClass' define un destructor no predeterminado pero no define un constructor de copia, un operador de asignación de copia, un constructor de movimiento o un operador de asignación de movimiento", que es la 'regla de cinco '.

Entiendo por qué la 'regla de los cinco' debe obedecerse en general, pero ¿sigue siendo aplicable para una clase base o interfaz abstracta?

Mi implicación es entonces:

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()
{
}

¿Es esto correcto? ¿Deberían estos métodos ser= delete ¿en lugar? ¿Hay alguna forma de declarar que el destructor es virtual puro y al mismo tiempo permanecer como predeterminado?

Incluso si declaro el destructor como:virtual ~InterfaceClass() = default;, si no omito explícitamente los otros cuatro, obtendré la misma advertencia del compilador.

Tl; dr: ¿Cuál es la forma correcta de satisfacer la 'regla de cinco' para una clase de interfaz ya que el usuario debe definir un destructor virtual?

¡Gracias por tu tiempo y ayuda!

Respuestas a la pregunta(3)

Su respuesta a la pregunta