Динамическая идентификация типов времени выполнения позволяет программе узнать реальный производный тип объекта, адресуемого по ссылке или по указателю на базовый класс. Реализована 2 операциями:
dynamic_cast
– поддерживает преобразование типов времени выполненияtypeid
идентифицирует реальный тип выраженияВстроенная унарная операция dynamic_cast языка C++ позволяет безопасно трансформировать указатель на базовый класс в указатель на производный класс:
class Alpha { };
class Beta : public Alpha { };
// ...
Alpha* alpha = new Beta;
if (Beta* beta = dynamic_cast<Beta*>(alpha)) {
// успешно. можем работать с функциями из Beta
} else {
// неуспешно
}
При невозможности трансформации возвращается нулевой указатель
То же самое можно проделать и с ссылками на объект.
void foo(Alpha& alpha) {
Beta& beta = dynamic_cast<Beta&>(alpha);
// ... Дальнейшая обработка
}
При невозможности ссылочного преобразования генерируется bad_cast
исключение. В общем случае все операции трансформации нужно производить ожидая, что может сгенерироваться ошибка. Работу с исключительными операциями рассмотрим позднее.
Встроенная унарная операция typeid позволяет установить фактический тип любых объектов
#include <typeinfo>
Alpha* alpha = new Alpha;
if (typeid(alpha) == typeid(Alpha*)) { /*...*/ }
if (typeid(*alpha) == typeid(Alpha)) { /*...*/ }