O typeid uz tady psali jini, k tomu se uz nebudu vracet (tbh, ani jsem to nevedel), ale chtel bych poznamenat neco k volani virtualni metody z konstruktoru:
V C++ nelze volat virtualni metodu z konstruktoru predka. Respektive lze, ale zavola se vzdy metoda z aktualne konstruovane tridy (ve stromu trid). Tedy pokud se zavola v Base::Base() metoda typeInfo, tak prestoze je to virtualni metoda, tak se zavola Base::typeInfo().
Duvod je ten, ze v dobe, kdy se vykonava konstruktor Base tridy, jeste neprobehl konstruktor Child tridy a ani inicializace zadnych atributu Child tridy. Volani virtualni metody by tak bylo potencialne nebezpecne.
Co je na tom blbe, ze prekladace se neobtezuji ani WARNovat - a pritom je to imho dost castym zdrojem chyb (taky se mi to stalo). Blbe je totiz, ze pokud volate sice nevirtualni metodu, ale ta zas vola virtualni, tak to neni ani na prvni pohled videt a v projektu, kde na stejnem kodu dela vic lidi, tak se to lehce prehlidne.
Sice, je to trochu neflexibilni, ale IMHO je to teda jeste porad lepsi, nez v Jave, kde by se v tomto pripade sice "spravne" zavola Child::typeInfo(), nicmene probnlem s inicializaci a poradim konstruktoru je tam uplne stejny, takze vysledek je, ze se vola virtualni metoda z neinicializovane tridy. To byva jeste horsi a jeste hur hledatelny pruser (opet bez nejake zminky prekladace).