dynamic_cast

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

В языке программирования C++, оператор dynamic_cast является частью механизма динамической идентификации типа данных, который позволяет выполнять приведение типа данных. В отличие от обычного приведения типа в стиле Си, проверка корректности приведения типов производится во время выполнения программы. Оператор dynamic_cast может быть применён к указателям или ссылкам. В случае если осуществляется преобразование указателя к типу данных, который не является фактическим типом объекта, в результате преобразования будет получен нулевой указатель. При работе с ссылками при невозможности преобразования типа будет сгенерировано исключение. Таким образом, оператор dynamic_cast обнаруживает сходство в процедуре приведения типа с таким языком программирования как Java, в отличие от Си, в котором не выполняется проверка корректности приведения типа во время выполнения программы.

Пример

Предположим, что некоторая функция принимает объект типа A в качестве аргумента и должна выполнить некоторые дополнительные действия в случае, если переданный в функцию объект фактически является объектом типа B - наследником класса A. Такое поведение может быть достигнуто при использовании dynamic_cast следующим образом.


<source lang="cpp">

  1. include <typeinfo> // Для std::bad_cast
  2. 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; } } </source>

Аналогичный код для функции my_function может быть записан с использованием указателей вместо ссылок:


<source lang="cpp"> 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;

} </source>

Ссылки

en:Dynamic cast fr:Dynamic cast it:Dynamic cast

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....