Назад к вопросам
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 с указателями и ссылками на классы, класс должен быть полиморфным, т.е. содержать хотя бы одну виртуальную функцию. Обычно для этого добавляют виртуальный деструктор.