C++/Ключові слова/dynamic cast

Матеріал з Вікіпідручника

Ключове слово dynamic_cast застосовується для приведення між собою вказівників або посилань на поліморфні типи, подібно до того, як це відбувається із ключовим словом static_cast, але з виконанням перевірки на безпечність приведення типів під час виконання програми, для того, щоб переконатися у відсутності помилок при приведенні. У загальному випадку таке приведення використовується з митою приведення вказівного типу або посилання вгору по ієрархії успадкування класів

У загальному випадку для цілей приведення покажчика або посилання вгору по ланцюжку спадкування (ієрархії наслідування) в безпечний спосіб.

Синтаксис
    TYPE& dynamic_cast<TYPE&> (object);
    TYPE* dynamic_cast<TYPE*> (object);

Цільовий тип має бути типом вказівника чи посилання, і результатом виразу має бути вказівник або посилання.

Якщо ви спробуєте приводити вказівний тип, і цей тип не можливо привести, бо він не співпадає з цільовим типом виразу, результат приведення буде NULL.

Якщо ви спробуєте приводити тип посилання, і цей тип не співпадає з типом об'єкту в аргументі і його не можливо привести до вказаного типу, тоді буде згенерована виключна ситуація std::bad_cast.

Якщо помилки приведення не відбулося, оператор dynamic_cast повертає вказівник або посилання цільового типу для вказаного у виразі об'єкта.

Приклад
  struct A {
    virtual void f() { }
  };
  struct B : public A { };
  struct C { };

  void f () {
    A a;
    B b;

    A* ap = &b;
    B* b1 = dynamic_cast<B*> (&a);  // NULL, оскільки 'a' не є 'B'
    B* b2 = dynamic_cast<B*> (ap);  // 'b'
    C* c = dynamic_cast<C*> (ap);   // NULL.

    A& ar = dynamic_cast<A&> (*ap); // Правильно.
    B& br = dynamic_cast<B&> (*ap); // Правильно.
    C& cr = dynamic_cast<C&> (*ap); // std::bad_cast
  }