run-time type information
Főnév
run-time type information (tsz. run-time type informations)
A run-time type information (RTTI) a C++ egy fontos mechanizmusa, amely lehetővé teszi a program számára, hogy futásidőben megismerje egy objektum típusát. Az RTTI akkor hasznos, amikor a típusokat nem statikusan, hanem dinamikusan, futásidőben kell kezelni, például öröklődés esetén, amikor egy bázisosztály pointerén keresztül próbálunk hozzáférni származtatott osztályokhoz.
A C++-ban az RTTI három fő funkcióval rendelkezik:
typeidoperátordynamic_castoperátortype_infoosztály
1. typeid operátor
A typeid operátor lehetővé teszi, hogy lekérdezzük egy objektum típusát futásidőben. Az operátor egy type_info objektumot ad vissza, amely tartalmazza az osztály nevét és más típusra vonatkozó információkat. A typeid operátor által visszaadott típus információ alapján tudhatjuk meg, hogy egy objektum milyen típusú.
Példa:
#include <iostream>
#include <typeinfo> // A typeid használatához szükséges
class Alap {
public:
virtual void fuggveny() { std::cout << "Alap osztály" << std::endl; }
};
class Szarmazott : public Alap {
public:
void fuggveny() override { std::cout << "Szarmazott osztály" << std::endl; }
};
int main() {
Alap* obj = new Szarmazott();
// `typeid` segítségével lekérdezzük az objektum típusát
std::cout << "Típus: " << typeid(*obj).name() << std::endl;
delete obj;
return 0;
}
Kimenet:
Típus: 7Szarmazott
Magyarázat: A typeid(*obj) a dinamikusan létrehozott objektum típusát adja vissza. A name() metódus a típus nevének kiírására szolgál, de a kimenet a fordítótól függően eltérhet (mivel a típusnév gyakran kódolt formában jelenik meg).
2. dynamic_cast operátor
A dynamic_cast operátor lehetővé teszi, hogy dinamikus típusellenőrzést végezzünk a bázisosztály pointerek és referenciák használatával. Ezt az operátort gyakran használják, amikor öröklődés során a bázisosztály pointeréből vagy referenciájából egy származtatott osztály pointerére vagy referenciájára szeretnénk konvertálni.
A dynamic_cast csak akkor működik megfelelően, ha az osztályok tartalmaznak legalább egy virtuális függvényt, hogy a futásidőben a típusok pontosan meghatározhatók legyenek.
Példa:
#include <iostream>
#include <typeinfo> // A typeid használatához szükséges
class Alap {
public:
virtual ~Alap() {} // Virtuális destruktor, hogy legyen RTTI
};
class Szarmazott : public Alap {
public:
void valami() { std::cout << "Szarmazott osztály" << std::endl; }
};
int main() {
Alap* obj = new Szarmazott();
// Dinamikus típusellenőrzés
Szarmazott* szarmazottObj = dynamic_cast<Szarmazott*>(obj);
if (szarmazottObj) {
std::cout << "A típus: Szarmazott" << std::endl;
szarmazottObj->valami();
} else {
std::cout << "Nem megfelelő típus!" << std::endl;
}
delete obj;
return 0;
}
Kimenet:
A típus: Szarmazott Szarmazott osztály
Magyarázat: A dynamic_cast segítségével a obj pointert a megfelelő típusra, Szarmazott*-ra konvertáljuk. Ha a konverzió sikeres, akkor az objektum típusának megfelelő metódusokat hívhatjuk meg. Ha a típus nem egyezik meg, akkor a dynamic_cast nullptr-t ad vissza.
3. type_info osztály
A type_info osztály a typeid operátor által visszaadott információt reprezentálja. A type_info osztály tartalmazza a típusokkal kapcsolatos adatokat, például a típus nevét. A type_info objektumokat nem lehet közvetlenül példányosítani, de a typeid operátor biztosítja őket.
A type_info osztály legfontosabb metódusai:
name(): A típus nevének visszaadása.before(const type_info& other): Két típus összehasonlítása.hash_code(): A típus hash kódja.
Példa:
#include <iostream>
#include <typeinfo>
class Alap {};
class Szarmazott : public Alap {};
int main() {
Alap* obj = new Szarmazott();
// Lekérjük a típusinformációt
const std::type_info& ti = typeid(*obj);
// Kiírjuk a típus nevét
std::cout << "A típus: " << ti.name() << std::endl;
delete obj;
return 0;
}
Kimenet:
A típus: 7Szarmazott
Magyarázat: A typeid(*obj) egy type_info objektumot ad vissza, amely tartalmazza az objektum típusának információit. A name() metódus segítségével kiírhatjuk a típus nevét. Mint korábban említettem, a name() metódus által visszaadott érték a fordítótól függően kódolt vagy egyszerűen az osztály neve lehet.
Összegzés
A run-time type information (RTTI) segítségével a C++ programok futásidőben információkat nyerhetnek ki az objektumok típusáról. Az RTTI alkalmazása lehetővé teszi a dinamikus típusellenőrzést, amely különösen hasznos öröklődés és polimorfizmus esetén. Az RTTI a következő C++ eszközöket biztosítja:
typeidoperátor: Lehetővé teszi az objektum típusának lekérdezését.dynamic_castoperátor: Segít biztonságosan végrehajtani típuskonverziót, amikor a típusok öröklődnek.type_infoosztály: A típusokkal kapcsolatos információk tárolására szolgál.
Ezek az eszközök segítenek abban, hogy a programok futásidőben is képesek legyenek dinamikusan kezelni az objektumok típusait.
- run-time type information - Szótár.net (en-hu)
- run-time type information - Sztaki (en-hu)
- run-time type information - Merriam–Webster
- run-time type information - Cambridge
- run-time type information - WordNet
- run-time type information - Яндекс (en-ru)
- run-time type information - Google (en-hu)
- run-time type information - Wikidata
- run-time type information - Wikipédia (angol)