C++
RTTI: Informacje o typie wykonania
Szukaj…
Nazwa typu
Można pobrać nazwę zdefiniowaną dla implementacji typu w środowisku wykonawczym, używając funkcji członkowskiej .name()
obiektu std::type_info
zwróconego przez typeid
.
#include <iostream>
#include <typeinfo>
int main()
{
int speed = 110;
std::cout << typeid(speed).name() << '\n';
}
Dane wyjściowe (zdefiniowane w realizacji):
int
dynamic_cast
Użyj funkcji dynamic_cast<>()
jako funkcji, która pomaga przerzucić hierarchię dziedziczenia ( opis główny ).
Jeśli musisz wykonać kilka prac niepolimorficznych na niektórych klasach pochodnych B
i C
, ale otrzymałeś class A
podstawową class A
, napisz w ten sposób:
class A { public: virtual ~A(){} };
class B: public A
{ public: void work4B(){} };
class C: public A
{ public: void work4C(){} };
void non_polymorphic_work(A* ap)
{
if (B* bp =dynamic_cast<B*>(ap))
bp->work4B();
if (C* cp =dynamic_cast<C*>(ap))
cp->work4C();
}
Słowo kluczowe typu
typeid
kluczowe typeid
jest jednoargumentowym operatorem, który dostarcza informacji o typie operandu w czasie wykonywania, jeśli typ operandu jest typem klasy polimorficznej. Zwraca wartość typu const std::type_info
. Kwalifikacje cv najwyższego poziomu są ignorowane.
struct Base {
virtual ~Base() = default;
};
struct Derived : Base {};
Base* b = new Derived;
assert(typeid(*b) == typeid(Derived{})); // OK
typeid
można również zastosować bezpośrednio do typu. W takim przypadku najpierw usuwane są referencje najwyższego poziomu, a następnie kwalifikacja cv najwyższego poziomu jest ignorowana. Tak więc powyższy przykład mógł zostać napisany za pomocą typeid(Derived)
zamiast typeid(Derived{})
:
assert(typeid(*b) == typeid(Derived{})); // OK
Jeśli typeid
zostanie zastosowany do dowolnego wyrażenia, które nie jest polimorficznym typem klasy, operand nie zostanie oceniony, a zwrócone informacje o typie dotyczą typu statycznego.
struct Base {
// note: no virtual destructor
};
struct Derived : Base {};
Derived d;
Base& b = d;
assert(typeid(b) == typeid(Base)); // not Derived
assert(typeid(std::declval<Base>()) == typeid(Base)); // OK because unevaluated
Kiedy używać, które obsadzono w c ++
Użyj dynamic_cast do konwersji wskaźników / referencji w hierarchii dziedziczenia.
Użyj static_cast do konwersji zwykłego typu.
Użyj reinterpret_cast do reinterpretacji wzorów bitowych na niskim poziomie. Używaj z dużą ostrożnością.
Użyj const_cast do odrzucenia const / volatile. Unikaj tego, chyba że utkniesz przy użyciu niepoprawnego interfejsu API.