- Sí, son lo mismo. 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 fue virtual en una clase base. En> = C++ 11 puede usar
final
para evitar que se anule en clases derivadas, pero eso no impide que sea virtual.
- Sí, un destructor en una clase derivada se puede omitir si no tiene nada que ver. Y no importa si es virtual o no.
- Lo omitiría si fuera posible. Y siempre uso la palabra clave
virtual
nuevamente para funciones virtuales en clases derivadas por razones de claridad. La gente no debería tener que recorrer todo el camino de la jerarquía de herencia para descubrir 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 la copia y mover los constructores y operadores de asignación si los quiero porque el compilador ya no los pondrá por ti.
Como un 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 esa predeterminada es una función en línea.
Las funciones en línea pueden exponer más de su programa a cambios en otras partes de su programa y hacer que la compatibilidad binaria para las bibliotecas compartidas sea complicada. Además, el aumento de acoplamiento puede dar lugar a una gran cantidad de recompilación frente a ciertos tipos de cambios. Por ejemplo, si decide que realmente desea una implementación para su destructor virtual, entonces cada parte del código que lo llamó tendrá que ser recompilado. Mientras que si lo hubiera declarado en el cuerpo de la clase y luego lo haya definido vacío en un archivo .cpp
, estaría bien cambiarlo sin volver a compilar.
Mi elección personal sería omitirla cuando sea posible. En mi opinión, complica el código, y el compilador a veces puede hacer cosas ligeramente más eficientes con una implementación predeterminada que con una vacía. Pero existen restricciones en las que puede estar inmerso que hacen que esa sea una mala elección.
Su última frase probablemente debería decir "no debería" en lugar de "debería". –
@Chris Lutz, estoy delante de ti en eso. Ha sido editado en sumisión ahora. :-) – Omnifarious
No estoy de acuerdo con la parte 'omit'. No cuesta mucho declararlo en el encabezado y definirlo (cuerpo vacío) en la fuente. Si lo hace, siempre puede regresar y agregar algunos pasos (¿inicio de sesión?) Sin forzar a sus clientes a recompilar. –