Mecanismul rtti (identificare de tip timp de execuție)

..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)