dynamic_cast
В языке программирования C++, оператор dynamic_cast
является частью механизма динамической идентификации типа данных, который позволяет выполнять приведение типа данных.
В отличие от обычного приведения типа в стиле Си, проверка корректности приведения типов производится во время выполнения программы. Оператор dynamic_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;
}
Ссылки
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....