- dynamic_cast
-
В языке программирования C++, оператор
dynamic_cast
является частью механизма динамической идентификации типа данных, который позволяет выполнять приведение типа данных. В отличие от обычного приведения типа в стиле Си, проверка корректности приведения типов производится во время выполнения программы. Операторdynamic_cast
может быть применён к указателям или ссылкам. В случае если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, в результате преобразования будет получен нулевой указатель. При работе с ссылками при невозможности преобразования типа будет сгенерировано исключение std::bad_cast. Таким образом, операторdynamic_cast
обнаруживает сходство в процедуре приведения типа с таким языком программирования как Java, в отличие от Си, в котором не выполняется проверка корректности приведения типа во время выполнения программы.Пример
Предположим, что некоторая функция принимает объект типа
A
в качестве аргумента и должна выполнить некоторые дополнительные действия в случае, если переданный в функцию объект фактически является объектом типаB
- наследником классаA
. Такое поведение может быть достигнуто при использованииdynamic_cast
следующим образом.#include <typeinfo> // Для std::bad_cast #include <iostream> // Для std::cerr и др. class A { public: // Механизм динамической идентификации типа данных доступен только для полиморфных // классов (т.е. классов, содержащих хотя бы одну виртуальную функцию-член) virtual void foo(); // другие члены класса... }; class B : public A { public: void methodSpecificToB(); // другие члены класса... }; void my_function(A& my_a) { try { B& my_b = dynamic_cast<B&>(my_a); my_b.methodSpecificToB(); } catch (const std::bad_cast& e) { std::cerr << e.what() << std::endl; std::cerr << "Этот объект не является объектом типа B" << std::endl; } }
Аналогичный код для функции
my_function
может быть записан с использованием указателей вместо ссылок:void my_function(A* my_a) { B* my_b = dynamic_cast<B*>(my_a); if (my_b) my_b->methodSpecificToB(); else std::cerr << "Этот объект не является объектом типа B" << std::endl; }
См. также
Ссылки
Категория:- C++
Wikimedia Foundation. 2010.