2010-04-07 9 views

Respuesta

-2

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.

+4

Es casi seguro que no lo es. Ver http://stackoverflow.com/questions/2156634/why-pure-virtual-function-is-initialized-by-0 –

+2

oh, muchacho, lo tomaste literalmente. ;) –

16

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.

-6

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.

+3

Dudo que exista un compilador, por lo que lo que dices es realmente cierto. –

+0

Wow ... y luego el compilador te preparará una buena cena y te matará después de que la termines. –

2

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.

Cuestiones relacionadas