Назад к вопросам
Middle
81
questionbank
Какие две функции можно использовать в C++ для определения типов во время выполнения программы?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
typeid и dynamic_cast.
-
typeid: Возвращает объектstd::type_info, который содержит информацию о типе выражения.#include <iostream> #include <typeinfo> class Base {}; class Derived : public Base {}; int main() { Base* b = new Derived(); std::cout << typeid(*b).name() << std::endl; // Выведет имя типа Derived (или mangled name) delete b; return 0; } -
dynamic_cast: Используется для безопасного нисходящего приведения типов в иерархии классов. Если приведение невозможно, возвращаетnullptrдля указателей или бросает исключениеstd::bad_castдля ссылок. Успешное приведение подразумевает, что тип объекта во время выполнения совпадает с целевым типом или наследует от него.#include <iostream> #include <typeinfo> class Base { public: virtual ~Base() {} }; // Нужен полиморфный тип class Derived : public Base {}; class Other {}; int main() { Base* b = new Derived(); Derived* d = dynamic_cast<Derived*>(b); // Успешное приведение if (d) { std::cout << "Каст к Derived успешен" << std::endl; } Other* o = dynamic_cast<Other*>(b); // Неуспешное приведение if (!o) { std::cout << "Каст к Other неуспешен" << std::endl; } delete b; return 0; }
Для корректной работы typeid и dynamic_cast с указателями и ссылками на классы, класс должен быть полиморфным, т.е. содержать хотя бы одну виртуальную функцию. Обычно для этого добавляют виртуальный деструктор.