Java y C# admiten la noción de clases que no se pueden usar como clases base con las palabras clave final
y sealed
. En C++, sin embargo, no hay una buena manera de evitar que una clase se derive de lo cual deja al autor de la clase con un dilema, ¿debería cada clase tener un destructor virtual o no?¿Debería cada clase tener un destructor virtual?
Editar: Como C++ 11 esto ya no es cierto, se puede especificar que una clase es final
.
Por un lado dar a un objeto un destructor virtual significa que tendrá un vtable
y por lo tanto consumir 4 (o 8 en máquinas de 64 bits) bytes adicionales por cada objeto para el vptr
.
Por otro lado, si alguien más tarde deriva de esta clase y elimina una clase derivada a través de un puntero a la clase base, el programa estará mal definido (debido a la ausencia de un destructor virtual) y optimizando francamente puntero por objeto es ridículo.
En el gripping hand teniendo un destructor virtual (posiblemente) se anuncia que este tipo está destinado a ser utilizado polimórficamente.
Algunas personas piensan que necesita una razón explícita para no usar un destructor virtual (como es el subtexto de this question) y otros dicen que debe usarlas solo cuando tenga motivos para creer que su clase se derivará de, ¿qué usted piensa?
Ya hay preguntas para los pros y los contras: ¿es este un duplicado, o es una encuesta de opinión? Si esto último, tal vez debería crear respuestas de "sí" y "no" para votar, entonces cierre la pregunta. Creo que esa es la forma recomendada de implementar una encuesta de opción múltiple en SO. –
Duplicados: http://stackoverflow.com/questions/270917/why-should-i-declare-a-virtual-destructor-for-an-abstract-class-in-c, http://stackoverflow.com/questions/300986/when-should-you-not-use-virtual-destructores –
"y la optimización franca para un puntero por objeto es ridículo". No es ridículo para objetos pequeños. C++ 0x está agregando un contenedor forward_list, precisamente porque a veces un puntero por sobrecarga de objetos es demasiado, a partir de los requisitos de espacio y tiempo. –