typeid и dynamic_cast.
typeid: Возвращает объект std::type_info, который содержит информацию о типе выражения.
c
dynamic_cast: Используется для безопасного нисходящего приведения типов в иерархии классов. Если приведение невозможно, возвращает nullptr для указателей или бросает исключение std::bad_cast для ссылок. Успешное приведение подразумевает, что тип объекта во время выполнения совпадает с целевым типом или наследует от него.
c
Для корректной работы typeid и dynamic_cast с указателями и ссылками на классы, класс должен быть полиморфным, т.е. содержать хотя бы одну виртуальную функцию. Обычно для этого добавляют виртуальный деструктор.