Si puo' essere un po' piu' precisi:
La gestione dei tipi primitivi (interi, double, char, vettoridi tipi primitivi) e' totalmente a carico del compilatore: cioe' e' il compilatore che tiene traccia del tipo dell'oggetto e corrispondentemente che tipo di istruzione assembler usare (8/16/32/84 bit).
A carico del compilatore e' anche tutta la gestione delle strutture dati (struct/class/union) che non coinvolgono la keyword virtual.
Invece, la gestione dei metodi virtuali, dell'overloading e dell'ereditarieta (semplice e multipla) e' gestita parte dal compilatore e parte da strutture dati di servizio allocate nella sezione degli oggetti globali.
Queste strutture dati vengono utilizzate dagli operatoridynamic_cast,typeid e typeof, durante la conversione di un puntatore di una classe base in uno di una classe derivata, oppure la conversione di una classe derivata in una classe base quando la classe risulta avere ereditarieta' multipla (deriva da due o piu' classi, direttamente o indirettamente).
Al momento, in C++ manca un supporto completo alla reflection, sullo stile di Java e C#.
Queste informazioni, in realta', esistono, perche' vengono utilizzate dal debugger, ma non sono disponibili ufficialmente.