2010-03-31 26 views
7

Quale tabella virtuale si troverà in una pura funzione virtuale? Nella classe base o classe derivata?Dove si trova la funzione virtuale pura in C++?

Ad esempio, che aspetto ha il tavolo virtuale in ogni classe?

class Base { 

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


class Derived: public Base{ 

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

} 
+0

questione connessa: http://stackoverflow.com/questions/2549618/ –

+0

Chi dice che c'è un tavolo virtuale? Lo standard non dice nulla su di loro e in quanto tali sono un frutto dell'immaginazione della gente :-) Se si desidera che i dettagli di implementazione specifici del compilatore siano menzionati, il compilatore che si sta utilizzando. –

risposta

15

g++ -fdump-class-hierarchy layout.cpp produce un file layout.cpp.class. Il contenuto di layout.cpp.class mostrerà il seguente:

 
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) 

Rimozione della 'purezza' di f cambia la quinta linea a:

 
16 Base::f 
+0

Cose davvero interessanti:) –

+0

+1 Nice - batti tutto il lavoro di congettura –

1

La voce vtable sarà nella classe base.

Perché? Poiché è possibile avere un tipo di puntatore di base che contiene un indirizzo dell'oggetto di tipo derivato e chiamare ancora il metodo sulla variabile del puntatore del tipo di base.

Pure virtuale dice semplicemente al compilatore che i tipi derivati ​​devono fornire la propria implementazione, e non possono fare affidamento sulla implementazione della classe base (se ne è anche specificato nella classe base)

1

In entrambe realtà. Il vtable della classe base avrà uno slot per la pura funzione virtuale che punta a qualcosa come lo stub pure_virtual_function_called() che probabilmente abortirebbe il programma, mentre il vtable della classe derivata avrà un puntatore all'attuazione reale.

2

Ogni classe ha il suo vtable. La voce per f in Base sarà NULL e la voce in Derived sarà un puntatore al codice per il metodo implementato.

+1

Beh, non proprio NULL. In VC++ la voce è l'indirizzo della funzione CRT _purecall: http://thetweaker.wordpress.com/2010/06/03/on-_purecall-and-the-overheads-of-virtual-functions/ –

Problemi correlati