RTTI (информация о типе времени выполнения) в C++

Опубликовано: 15 Сентября, 2022

В C++ RTTI (информация о типе во время выполнения) — это механизм, который предоставляет информацию о типе данных объекта во время выполнения и доступен только для классов, которые имеют хотя бы одну виртуальную функцию. Это позволяет определить тип объекта во время выполнения программы.

Приведения во время выполнения

Приведение во время выполнения, которое проверяет правильность приведения, является простейшим подходом к определению типа объекта во время выполнения с помощью указателя или ссылки. Это особенно полезно, когда нам нужно преобразовать указатель из базового класса в производный тип. При работе с иерархией наследования классов обычно требуется приведение типа объекта. Различают два вида литья:

  • Upcasting: когда указатель или ссылка объекта производного класса рассматривается как указатель базового класса.
  • Нисходящее приведение: когда указатель или ссылка базового класса преобразуются в указатель производного класса.

Использование ' dynamic_cast ': в иерархии наследования используется для понижения приведения указателя базового класса к дочернему классу. При успешном приведении он возвращает указатель преобразованного типа и, тем не менее, терпит неудачу, если мы пытаемся привести недопустимый тип, такой как указатель объекта, который не относится к типу желаемого подкласса.

Например, dynamic_cast использует RTTI, и следующая программа завершается сбоем с ошибкой " невозможно dynamic_cast `b' (типа `class B*') для типа `class D*' (исходный тип не является полиморфным) ", потому что нет виртуальной функции в базовом классе Б.

CPP




// C++ program to demonstrate
// Run Time Type Identification(RTTI)
// but without virtual function
 
#include <iostream>
using namespace std;
 
// initialization of base class
class B {};
 
// initialization of derived class
class D : public B {};
 
// Driver Code
int main()
{
    B* b = new D; // Base class pointer
    D* d = dynamic_cast<D*>(b); // Derived class pointer
    if (d != NULL)
        cout << "works";
    else
        cout << "cannot cast B* to D*";
    getchar(); // to get the next character
    return 0;
}

Добавление виртуальной функции к базовому классу B заставляет его работать.

C++