Veo en this entry que la herencia virtual agrega sizeof (puntero) a la huella de memoria de un objeto. Aparte de eso, ¿hay algún inconveniente para mí al usar herencia virtual por defecto y herencia convencional solo cuando sea necesario? Parece que llevaría a un diseño de clase más a prueba de futuro, pero tal vez me estoy perdiendo un escollo.En C++, ¿debería usar casi siempre la herencia virtual?
Respuesta
Las desventajas son que
- Todas las clases tendrán que inicializar todos sus bases virtuales todo el tiempo (por ejemplo, si A es base virtual de B, y C se deriva de B, sino que también tiene que inicializar una misma)
- Tienes que usar el más caro
dynamic_cast
donde sea que uses unstatic_cast
(puede o no ser el problema, dependiendo de tu sistema y si tu diseño lo requiere).
El punto 1 solo hace que no valga la pena, ya que no puede ocultar sus bases virtuales. Casi siempre hay una mejor manera.
Oh dios (1) es horrible. ¡Gracias! ¿Podrías ser más explícito sobre (2)? ¿Quiere decir que el compilador arroja un error si trato de usar static_cast
@SuperElectric: ¿por qué es (1) horrible? ¿Sería mejor si un subobjeto base no se inicializara? ;) – Yttrill
Comentarios como "no vale la pena" muestran una falla completa al no entender el propósito de las bases virtuales: la herencia virtual debe * siempre * ser utilizada cuando se está subclasando una abstracción. No hay solución alternativa u otra posibilidad, si no la usa no puede usar múltiples subclases de abstracciones sin volver atrás y corregir su error de diseño, rompiendo así la encapsulación. – Yttrill
En mi experiencia, la herencia virtual (a diferencia de métodos virtuales) casi nunca es necesaria. En C++ se usa para direccionar el "diamond inheritance problem", que si se evita la herencia múltiple en realidad no puede suceder.
Estoy bastante seguro de que nunca he encontrado herencia virtual fuera de los libros en C++, que incluye tanto el código que escribo como el millón de sistemas de línea que mantengo.
La biblioteca de flujos de E/S de C++ estándar usa herencia virtual. Pero sí, aparte de eso, en general es bastante raro. –
Greg: +1 excelente generalización en todo el lío de herencia virtual. –
Hmm ... Ya sé para qué sirve (estoy pensando en usarlo), y entiendo que es raro (código en C++), pero la pregunta que planteé fue "cuáles son los inconvenientes de la herencia virtual". – SuperElectric
- 1. ¿Debería escribir "público virtual" o "público virtual" en herencia virtual?
- 2. C++ herencia virtual
- 3. ¿Debería siempre usar GL_CULL_FACE?
- 4. Dominio en la herencia virtual
- 5. Orden de constructor en la herencia virtual
- 6. ¿Cómo funciona la herencia virtual?
- 7. C++ Herencia virtual múltiple frente a COM
- 8. ¿Por qué no podemos usar "herencia virtual" en COM?
- 9. herencia virtual Confusión
- 10. Constructor predeterminado y herencia virtual
- 11. ¿Por qué no debería usar iguales con la herencia?
- 12. Impacto del rendimiento de la herencia virtual
- 13. Herencia virtual pura, herencia múltiple, y C4505
- 14. ¿Debería usar identificadores internacionales en Java/C#?
- 15. ¿Por qué MySQL consultas casi siempre escrito en capital
- 16. Herencia virtual y temido diamante
- 17. gcc 4.5.1 tema herencia virtual
- 18. En C++, ¿qué haces casi todo el tiempo?
- 19. función virtual en herencia privada o protegida
- 20. Error de herencia virtual en MSVC
- 21. Herencia en C++
- 22. Prevenir la herencia de clases en C++
- 23. C#: ¿Cuándo debería usar TryParse?
- 24. ¿Debería cada clase tener un destructor virtual?
- 25. C# Logging. ¿Qué debería usar?
- 26. ¿Cómo soluciona la herencia virtual la ambigüedad de "diamante" (herencia múltiple)?
- 27. C++ vector con la herencia
- 28. EF4.1 POCO: Por qué debería usar ICollection
- 29. herencia de interfaces en C++
- 30. ¿Cuándo debería usar assign en Objective c?
El orden de inicialización de las clases base no es obvio para la mayoría de las personas. Por lo tanto, el costo de mantenimiento aumenta. –
La herencia virtual agrega un puntero interno solo en algunas implementaciones. Itanium ABI no utiliza punteros internos, solo vptr. – curiousguy