Ugrás a tartalomhoz

run-time type information

A Wikiszótárból, a nyitott szótárból
(RTTI szócikkből átirányítva)


Főnév

run-time type information (tsz. run-time type informations)

  1. (informatika)

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:

  1. typeid operátor
  2. dynamic_cast operátor
  3. type_info osztá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:

  • typeid operátor: Lehetővé teszi az objektum típusának lekérdezését.
  • dynamic_cast operátor: Segít biztonságosan végrehajtani típuskonverziót, amikor a típusok öröklődnek.
  • type_info osztá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.