..1 Mecanismul RTTI (identificare tip timp de execuție)
..1.1 static_cast și pointers
Implicit turnare un pointer la un obiect de tip derivat la un pointer la un compilator obiect îndeplinește perfect tipul de bază în sine ca o clasă derivată conține definiția completă a claselor sale de bază => astfel de creșteri (Upcast) turnate este întotdeauna în siguranță!
Este adevărat următoarea declarație: dacă obiectul este, de fapt, obiectul unui tip derivat, dar avem un pointer la o clasă de bază, corectă ar trebui să fie și indicele de conversie „în jos“ pe ierarhia de clasă până la conversia pointer la un pointer la real (țintă) tip - downcast.
Pentru a aduce indicatorul la tipul de bază la un tip derivat este un operator de indicator de tip explicit static_cast - un mecanism de compilare de timp!
// A și B sunt legate prin moștenire
clasa B: publică
// Cu - clasă "independentă"
B * pB = static_cast(PA); // din punctul de vedere al compilatorului toate sunt corecte, deoarece clasele sunt legate prin moștenire!
// F (d); // eroare compilator - nici o astfel de conversie!
F (a); // nu există o eroare de compilator, dar rezultatul este incorect, deoarece, de fapt, obiectul este A, nu B!
Notă: compilatorul verifică numai faptul că ambele clase sunt asociate cu moștenirea => consideră că distribuția este corectă. Dar, de fapt, o astfel de transformare nu este sigură! Prin urmare, a existat o nevoie de o modalitate de a verifica posibilitatea unei astfel de transformări.
Notă: static_cast este de obicei utilizat pentru tipuri non-polimorfe (fără funcții virtuale).
..1.2 Identificarea dinamică a tipului
RTTI se caracterizează prin trei concepte:
1) operator dynamic_cast - pentru transformarea tipurilor polimorfe
2) tipul operatorului - pentru a determina tipul exact al obiectului
3) clasa type_info - (aceasta este ceea ce revine operator typeid)
..1.3 Pentru a conecta RTTI:
1) în opțiunile de proiect de proiect \ Properties \ C / C ++ \ Language - enable Activează Run-Time info Tip (sau / GR)
2) #include
3) mecanismul funcționează numai pentru clasele polimorfe (adică sunt implicate tabele cu funcții virtuale)
..1.4 Operatorul tipid și clasa type_info Meyers2 - p132
Identificarea tipurilor în timpul rulării vă permite să obțineți informații despre obiecte și clase. În acest caz, trebuie să fie alocată o zonă de stocare pentru a stoca informațiile solicitate.
1) indiferent de cât de multe X-clasa de facilități nu am creat suficient pentru a stoca informații despre tipul real al X într-un singur exemplar în fiecare clasă => pentru fiecare clasă de compilator creează structura type_info tip de date
2) trebuie să existe o modalitate de a obține această informație pentru fiecare obiect => accesul la obiectul type_info poate fi obținut cu operatorul typeid.
3) Ce există într-o singură instanță pentru toate obiectele? - statică sau tabel de funcții virtuale. Specificația de limbă spune că obținerea acestor informații este garantată numai pentru tipurile polimorfe (adică dacă există cel puțin o funcție virtuală). Aceste RTTI efectua aproximativ aceeași problemă ca și tabelul de funcții virtuale => RTTI a fost proiectat tocmai cu o masă virtuală de clasă. De exemplu, indexul 0 din tabel poate conține un pointer la obiectul type_info:
În această implementare, memoria va fi cheltuită numai pe adăugarea unei alte celule din fiecare alocare tabel funcție + memorie virtuală pentru stocarea type_info obiect pentru fiecare clasă.
..1.4.1 Format type_info
int operator == (const tip_info rhs) const;
int operator! = (const tip_info rhs) const;
int înainte de (const type_info rhs) const;
const char * raw_name () const; // decorat nume
Caracteristici principale: 1) Operatorii == și! = Sunt supraîncărcați.
2) + metode pentru a obține numele clasei.
..1.4.2 Tipul operatorului tip:
const tip_info typeid (object) // unde obiectul poate fi o expresie, de exemplu (* P)
const tip_info tipid (tip)