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)