- Sí, son iguales. La clase derivada que no declara algo virtual no impide que sea virtual. De hecho, no hay forma de evitar que un método (destructor incluido) sea virtual en una clase derivada si fuera virtual en una clase base. En> = C ++ 11 se puede utilizar
final
para evitar que se anule en clases derivadas, pero eso no impide que sea virtual.
- Sí, se puede omitir un destructor en una clase derivada si no tiene nada que hacer. Y no importa si es virtual o no.
- Lo omitiría si fuera posible. Y siempre uso la
virtual
palabra clave nuevamente para funciones virtuales en clases derivadas por razones de claridad. La gente no debería tener que subir hasta arriba en la jerarquía de herencia para darse cuenta de que una función es virtual. Además, si su clase se puede copiar o mover sin tener que declarar su propia copia o mover constructores, declarar un destructor de cualquier tipo (incluso si lo define como default
) lo obligará a declarar los constructores copiar y mover y los operadores de asignación si lo desea ya que el compilador ya no los colocará por usted.
Como pequeño punto para el elemento 3. Se ha señalado en los comentarios que si un destructor no se declara, el compilador genera uno predeterminado (que sigue siendo virtual). Y ese predeterminado es una función en línea.
Las funciones en línea exponen potencialmente más de su programa a cambios en otras partes de su programa y hacen que la compatibilidad binaria para bibliotecas compartidas sea complicada. Además, el aumento del acoplamiento puede resultar en una gran recompilación frente a ciertos tipos de cambios. Por ejemplo, si decide que realmente quiere una implementación para su destructor virtual, entonces cada fragmento de código que lo llamó deberá ser recompilado. Mientras que si lo hubiera declarado en el cuerpo de la clase y luego lo hubiera definido vacío en un .cpp
archivo, estaría bien cambiarlo sin volver a compilar.
Mi elección personal aún sería omitirlo cuando sea posible. En mi opinión, satura el código y el compilador a veces puede hacer cosas un poco más eficientes con una implementación predeterminada sobre una vacía. Pero hay limitaciones en las que puede encontrarse que hacen que sea una mala elección.