Eventuali duplicati:
Understanding the vtable entriesSpiegazione della tabella virtuale
Utilizzando g ++ versione 4.6.3, computer a 64 bit. So che il compilatore è libero di implementare le funzioni virtuali nel modo desiderato. Voglio sapere cosa è successo qui.
La mia classe:
#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};
int main()
{
test obj;
obj.func();
return 0;
}
Guardando tavolo virtuale generato dal compilatore,
Vtable for test
test::_ZTV4test: 3u entries
0 (int (*)(...))0 (<---- what is this?)
8 (int (*)(...))(& _ZTI4test)
16 (int (*)(...))test::func
all'offset 8 è RTTI
all'offset 16 è entrata per la funzione virtuale.
La mia domanda è perché c'è una voce per NULL a offset 0 o in altre parole qual è lo scopo della prima immissione?
P.S. Ho pensato che questo potesse essere correlato all'allineamento, ma poi ho aggiunto più funzioni virtuali ma la voce RTTI era ancora in offset 8.
Suppongo che sia riservato per il distruttore (che non è stato aggiunto). – john
@John, il distruttore aggiunto ha ancora lo stesso output. Inoltre, è necessario che il distruttore faccia sempre parte di v-table? – Anon
È molto comune disporre di un distruttore virtuale se si dispone di funzioni virtuali. Ma non è richiesto. Oh bene, la mia ipotesi era sbagliata. – john