A rtti mechanizmus (futásidejű típusazonosító)
..1 Az RTTI mechanizmusa (futásidejű típusazonosító)
..1.1 static_cast és mutatók
Implicit casting mutatót egy objektum egy származtatott típusú mutató egy objektum fordító tökéletesen megfelel az alaptípus magát származtatott osztály tartalmazza a teljes meghatározását az alap osztályok => mint nő (felfelé fordított) öntött mindig biztonságban!
Igaz, a következő nyilatkozatot teszi: ha az objektum valójában a tárgy származtatott típus, de van olyan mutató, amely alap osztály, a megfelelő legyen, és az átalakítás index „lefelé” az osztály hierarchia, amíg az átalakítás a mutató egy mutató mutat a tényleges (cél) típus - downcast.
Ahhoz, hogy a mutatót az alap típusához hozzuk a származtatott típusú mutatóhoz, a static_cast nevű explicit cast operátor a fordítási idő mechanizmus!
// A és B örökléssel kapcsolódik
B osztály: nyilvános A
// A - "független" osztályban
B * pB = statikus_cast(PA); // a fordító szempontjából minden helyes, mivel az osztályok örökléssel vannak összekapcsolva!
// F (d); // fordító hiba - nincs ilyen átalakítás!
F (a); // nincs fordító hiba, de az eredmény helytelen, mert valójában az objektum A, nem B!
Megjegyzés: a fordító csak azt ellenőrzi, hogy mindkét osztályhoz társult-e az öröklés => ezt az eredményt helyesnek tartja. De valójában egy ilyen átalakulás nem biztonságos! Ezért szükség volt egy ilyen átalakulás lehetőségének ellenőrzésére.
Megjegyzés: a static_cast általában nem polimorf típusokhoz (nem virtuális függvényekhez) használható.
..1.2 Dinamikus típusú azonosítás
Az RTTI-t három fogalom jellemzi:
1) dynamic_cast operátor - polimorf típusok átalakítására
2) operator typeid - az objektum pontos (pontos) típusának meghatározása
3) class type_info - (ez az, amit a typeid operátor visszaküld)
..1.3 Az RTTI csatlakoztatása:
1) a projekt opcióiban Project \ Properties \ C / C ++ \ Nyelv - Enable Run-Time Type információ engedélyezése (vagy / GR)
2) #include
3) a mechanizmus csak polimorf osztályokra működik (azaz a virtuális függvények táblái is érintettek)
..1.4 A typeid operátor és a type_info osztály Meyers2 - p132
A típusok azonosítása futási időben lehetővé teszi az objektumok és osztályok információinak megismerését. Ebben az esetben tárolt területet kell felosztani a kért adatok tárolására.
1) hány X osztályú objektumot nem hoztunk létre, elegendő egyetlen típusú X-típusú információ tárolása minden osztályban => minden osztályhoz a fordító létrehoz egy típusú típusú type_info adatot
2) meg kell adni egy módot ezen információk lekérésére minden objektumhoz => a type_info objektumhoz való hozzáférés a typeid operátorral érhető el.
3) Mi létezik egy példányban minden objektum számára? - statikus vagy virtuális funkciókat tartalmazó táblázat. A nyelvi specifikáció azt mondja, hogy ezen információk megszerzése csak polimorf típusokra (azaz ha legalább egy virtuális függvény van) garantált. Az RTTI adatok ugyanazt a feladatot végzik, mint a virtuális funkciótáblázat => Az RTTI pontosan egy virtuális osztálytáblázat segítségével került kifejlesztésre. Például a táblázat 0 indexe tartalmazhat egy mutatót a type_info objektumhoz:
Ezzel a megvalósítással a memóriát csak egy újabb cellát kell hozzáadni minden egyes virtuális funkciótáblához + a memóriát a típus_info objektum egyes osztályok tárolásához.
..1.4.1 Format type_info
int operátor == (const típus_info rhs) const;
int operátor! = (const típusú_info rhs) const;
int előtt (const type_info rhs) const;
const char * raw_name () const; // díszített név
Főbb jellemzők: 1) Operátorok == és! = Túlterheltek.
2) + az osztálynév megszerzésének módja.
..1.4.2 A kezelő típusa:
const type_info typeid (objektum) // ahol az objektum lehet egy kifejezés, például (* P)
const type_info typeid (típus)