Динамическая идентификация типов времени выполнения

Динамическая идентификация типов времени выполнения позволяет программе узнать реальный производный тип объекта, адресуемого по ссылке или по указателю на базовый класс. Реализована 2 операциями:

  • dynamic_cast – поддерживает преобразование типов времени выполнения
  • операция typeid идентифицирует реальный тип выражения

Операция dynamic_cast

Встроенная унарная операция dynamic_cast языка C++ позволяет безопасно трансформировать указатель на базовый класс в указатель на производный класс:

class Alpha { };
class Beta : public Alpha { };

// ...

Alpha* alpha = new Beta;
if (Beta* beta = dynamic_cast<Beta*>(alpha)) {
	// успешно. можем работать с функциями из Beta
 } else { 
	// неуспешно
 }

При невозможности трансформации возвращается нулевой указатель

Операция dynamic_cast (ссылки)

То же самое можно проделать и с ссылками на объект.

void foo(Alpha& alpha) {
    Beta& beta = dynamic_cast<Beta&>(alpha);
    // ... Дальнейшая обработка
}

При невозможности ссылочного преобразования генерируется bad_cast исключение. В общем случае все операции трансформации нужно производить ожидая, что может сгенерироваться ошибка. Работу с исключительными операциями рассмотрим позднее.

Операция typeid

Встроенная унарная операция typeid позволяет установить фактический тип любых объектов

#include <typeinfo>
Alpha* alpha = new Alpha;

if (typeid(alpha) == typeid(Alpha*)) { /*...*/ }
if (typeid(*alpha) == typeid(Alpha)) { /*...*/ }