2010-03-31 16 views
7

¿Qué tabla virtual será la función virtual pura ubicada? En la clase base o clase derivada?¿Dónde se encuentra la función virtual pura en C++?

Por ejemplo, ¿cómo se ve la tabla virtual en cada clase?

class Base { 

    virtual void f() =0; 
    virtual void g(); 
} 


class Derived: public Base{ 

    virtual void f(); 
    virtual void g(); 

} 
+0

pregunta relacionada: http://stackoverflow.com/questions/2549618/ –

+0

¿Quién dice que hay una tabla virtual? El estándar no dice nada sobre ellos y, como tales, son una invención de la imaginación de la gente :-) Si desea detalles de implementación específicos del compilador, debe mencionar el compilador que está utilizando. –

Respuesta

15

g++ -fdump-class-hierarchy layout.cpp produce un archivo layout.cpp.class. El contenido de layout.cpp.class mostrará lo siguiente:

 
Vtable for Base 
Base::_ZTV4Base: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI4Base) 
16 __cxa_pure_virtual 
24 Base::g 

Class Base 
    size=8 align=8 
    base size=8 base align=8 
Base (0x7ff893479af0) 0 nearly-empty 
    vptr=((& Base::_ZTV4Base) + 16u) 

Vtable for Derived 
Derived::_ZTV7Derived: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI7Derived) 
16 Derived::f 
24 Derived::g 

Class Derived 
    size=8 align=8 
    base size=8 base align=8 
Derived (0x7ff893479d90) 0 nearly-empty 
    vptr=((& Derived::_ZTV7Derived) + 16u) 
    Base (0x7ff893479e00) 0 nearly-empty 
     primary-for Derived (0x7ff893479d90) 

Extracción de la 'pureza' de f cambia la quinta línea a:

 
16 Base::f 
+0

Cosas interesantes:) –

+0

+1 Agradable: supera todas las conjeturas –

1

La entrada de vtable estará en la clase base.

¿Por qué? Porque puede tener un tipo de puntero base que contenga la dirección de un objeto de tipo derivado y todavía llame al método en la variable de puntero del tipo de base.

virtual pura simplemente le dice al compilador que los tipos derivados deben proporcionar su propia implementación, y que no se puede confiar en la implementación de la clase base (si hay uno siquiera se especifica en la clase base)

1

Tanto en realidad. La clase base vtable tendrá una ranura para la función virtual pura que apunte a algo como el talón pure_virtual_function_called() que probablemente abortará el programa, mientras que la clase derivada vtable tendrá un puntero a la implementación real.

2

Cada clase tiene su propio vtable. La entrada para f en Base será NULL, y la entrada en Derived será un puntero al código del método implementado.

+1

Bueno, realmente no es NULO. En VC++, la entrada es la dirección de la función CRT _purecall: http://thetweaker.wordpress.com/2010/06/03/on-_purecall-and-the-overheads-of-virtual-functions/ –

Cuestiones relacionadas