Оператор dynamic_cast

Оператор dynamic_cast выполняет приведение типов указателей или ссылок. Применяется для приведения полиморфных типов. Если приведение указателя окончилось неудачей, оператор возвращает нулевой указатель, а если проблема со ссылкой, то генерируется исключение bad_cast (объект исключения объявлен в файле typeinfo). Формат оператора:

dynamic_cast< Тип_результата >(<Выражение>)

Как вы уже знаете, указатель, имеющий тип базового класса, может ссылаться на объект любого производного класса. Однако, если указатель имеет тип производного класса, то сохранить в нем адрес объекта базового типа нельзя. Различные способы приведения и пример проверки корректности приведения приведены в листинге 13.32.

Листинг 13.32. Оператор dynamic_cast

#include <iostream>
#include <typeinfo>

class A {
public:
   virtual void func(); // Виртуальный метод
   virtual ~A() {}      // Деструктор
};
class B : public A {
public:
   void func() override;
   void print_OK() { std::cout << "OK" << std::endl; }
};

void A::func() { std::cout << "A::func()" << std::endl; }
void B::func() { std::cout << "B::func()" << std::endl; }

void func1(A *obj) {
   obj->func();
   B *p = dynamic_cast<B*>(obj);
   if (p) p->print_OK();
   else std::cout << "p не класса B" << std::endl;
}

void func2(A &obj) {
   obj.func();
   try {
      B &obj2 = dynamic_cast<B&>(obj);
      obj2.print_OK();
   } catch (std::bad_cast &ex) {
      std::cout << ex.what() << ' ';
      std::cout << "obj не класса B" << std::endl;
   }
}

int main() {
   A a;
   B b;
   // Указатели
   func1(&a);
   func1(&b);
   // Ссылки
   func2(a);
   func2(b);
   return 0;
}

Результат:

A::func()
p не класса B
B::func()
OK
A::func()
std::bad_cast obj не класса B
B::func()
OK

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов