2010-03-31 5 views
7

Quelle table virtuelle sera la fonction virtuelle pure localisée? Dans la classe de base ou dans la classe dérivée? Par exemple, à quoi ressemble la table virtuelle dans chaque classe?Où est la fonction virtuelle pure située en C++?

class Base { 

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


class Derived: public Base{ 

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

} 
+0

question connexe: http://stackoverflow.com/questions/2549618/ –

+0

Qui a dit qu'il y a une table virtuelle? La norme ne dit rien sur eux et en tant que tels, ils sont une fiction de l'imagination des gens :-) Si vous voulez des détails d'implémentation spécifiques au compilateur, vous devez mentionner le compilateur que vous utilisez. –

Répondre

15

g++ -fdump-class-hierarchy layout.cpp produit un fichier layout.cpp.class. Le contenu de layout.cpp.class affiche les informations suivantes:

 
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) 

Retrait de la 'pureté' de f change la cinquième ligne à:

 
16 Base::f 
+0

Cool stuff en effet: –

+0

+1 Nice - battre tout deviner le travail –

1

L'entrée vtable sera dans la classe de base.

Pourquoi? Parce que vous pouvez avoir un type de pointeur de base qui contient l'adresse d'un objet de type dérivé et encore appeler la méthode sur la variable pointeur du type de base.

dit simplement virtuel pur le compilateur que les types dérivés doivent fournir leur propre mise en œuvre, et ils ne peuvent pas compter sur la mise en œuvre de la classe de base (si l'on est même spécifié dans la classe de base)

1

Dans les deux en fait. La classe de base vtable aura un emplacement pour la fonction virtuelle pure pointant vers quelque chose comme pure_virtual_function_called() stub qui interromprait probablement le programme, tandis que la classe dérivée vtable aura un pointeur vers l'implémentation réelle.

2

Chaque classe a son propre vtable. L'entrée pour f dans Base sera NULL et l'entrée dans Derived sera un pointeur vers le code de la méthode implémentée.

+1

Eh bien, pas vraiment NULL. Dans VC++ l'entrée est l'adresse de la fonction CRT _purecall: http://thetweaker.wordpress.com/2010/06/03/on-_purecall-and-the-overheads-of-virtual-functions/ –

Questions connexes