Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Оператор 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
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов