¿Tenemos virtual table para un abstract class?¿Las clases abstractas tienen un VTABLE?
Respuesta
Sí. Si usted dice:
virtual void foo() = 0;
es casi literalmente una misión de 0 a una entrada en la viable. No tome esto literalmente, pero es una buena manera de recordar lo que significa.
En primer lugar, el uso de vtables está definido por la implementación y no es un requisito de la norma.
Para las implementaciones que usan vtable, la respuesta es: Sí, generalmente. Se podría pensar que no se requiere vtable para las clases abstractas porque la clase derivada tendrá su propia tabla virtual, pero se necesita durante la construcción: mientras se construye la clase base, establece el puntero vtable en su propia tabla virtual. Más tarde, cuando se ingrese el constructor de clase derivado, usará su propio vtable en su lugar.
Dicho esto, en algunos casos esto no es necesario y el vtable puede optimizarse. Por ejemplo, MS Visual C++ proporciona el indicador __declspec(novtable)
para deshabilitar la generación de Vtable en clases de interfaz puras.
Tenemos una tabla virtual para una clase que tiene al menos una función virtual. esa función virtual también puede ser pura. esto significa. una clase abstracta puede tener un vtable.
en el caso de clases abstact, la entrada de vtable será NULL. cada vez que intente crear una instancia de una clase abstracta, comprobará en el archivo vtable y comprobará si hay un valor nulo presente o no. si está presente NULL, el compilador lanzará un error.
Dudo que exista un compilador, por lo que lo que dices es realmente cierto. –
Wow ... y luego el compilador te preparará una buena cena y te matará después de que la termines. –
Parece que hay una idea falsa común aquí, y creo que todavía se pueden encontrar rastros de sus fuentes en línea. Paul DiLascia wrote en algún momento de 2000 que -
... ver que el compilador todavía genera un vtable porque todas sus entradas son nulos y todavía genera código para inicializar la viable en el constructor o destructor para una
Eso puede haber sido cierto entonces, pero ciertamente no es ahora.
Sí, las clases abstractas sí tienen tablas virtuales, también con métodos abstractos puros (estas pueden implementarse y llamarse), y sí, su constructor inicializa las entradas puras a un valor especificado. Para VC++ al menos, ese valor está en la dirección de la función CRT _purecall. De hecho, puede controlar ese valor, ya sea por overloading purecall yourself o using _set_purecall_handler.
- 1. ¿Por qué las clases abstractas en Java tienen constructores?
- 2. Clases selladas abstractas
- 3. Cómo crear propiedades abstractas en las clases abstractas de Python
- 4. ¿Múltiples clases abstractas derivadas?
- 5. Cómo probar las clases abstractas de unidad
- 6. .net Herencia múltiple de las clases abstractas
- 7. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 8. ¿Las clases abstractas pueden implementarse en C#?
- 9. Java: variables finales en las clases abstractas
- 10. Grandes clases base abstractas
- 11. JAXB y clases abstractas
- 12. ¿Constructores en clases abstractas?
- 13. AS3 - clases abstractas
- 14. Interfaces vs. clases abstractas
- 15. ¿Las clases abstractas de Do/can reemplazan las interfaces?
- 16. Clases abstractas en relaciones GORM
- 17. Alternativas a clases abstractas en Ruby?
- 18. de Python(), las clases base abstractas y NotImplementedError
- 19. ¿Las clases de ayudante/utilidad deben ser abstractas?
- 20. Java genéricos, genéricos extendidas y las clases abstractas
- 21. sun.org.mozilla Rhino y se extienden las clases abstractas Java
- 22. Qt interfaces o clases abstractas y qobject_cast()
- 23. ¿Por qué crear clases e interfaces abstractas?
- 24. Pruebas unitarias clases abstractas y/o interfaces
- 25. Pruebas unitarias Clases abstractas en Groovy
- 26. Registro de Java con clases abstractas
- 27. debería nombrar todas mis clases abstractas AbstractFoo
- 28. mvc3 razor editortemplate con clases abstractas
- 29. Uso de WCF con clases abstractas
- 30. ventajas de usar un clases abstractas vs. clase regular
Es casi seguro que no lo es. Ver http://stackoverflow.com/questions/2156634/why-pure-virtual-function-is-initialized-by-0 –
oh, muchacho, lo tomaste literalmente. ;) –