Оператор dynamic_cast
Оператор dynamic_cast выполняет преобразование типов с проверкой
во время выполнения программы. Он применяется для приведения указателей
и ссылок внутри иерархии наследования. Если преобразование невозможно,
для указателей возвращается нулевой указатель, а для ссылок выбрасывается
исключение std::bad_cast.
В угловых скобках указывается целевой тип, а в круглых скобках -
исходное выражение. Оператор dynamic_cast работает только
с полиморфными типами, то есть с классами, у которых есть хотя бы
одна виртуальная функция.
Синтаксис
dynamic_cast<target_type>(expression)
Пример
Давайте приведём указатель базового класса к указателю производного класса:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void show()
{
cout << "Base" << endl;
}
};
class Derived : public Base
{
public:
void show() override
{
cout << "Derived" << endl;
}
};
int main()
{
Base* base = new Derived;
Derived* derived = dynamic_cast<Derived*>(base);
if (derived)
{
derived->show();
}
delete base;
return 0;
}
Результат выполнения кода:
"Derived"
Пример
Давайте попробуем выполнить некорректное приведение и проверим результат:
#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
void hello()
{
cout << "Hello" << endl;
}
};
int main()
{
Base* base = new Base;
Derived* derived = dynamic_cast<Derived*>(base);
if (derived)
{
derived->hello();
}
else
{
cout << "Cast failed" << endl;
}
delete base;
return 0;
}
Результат выполнения кода:
"Cast failed"
Пример
Давайте выполним приведение ссылки и обработаем исключение:
#include <iostream>
#include <typeinfo>
using namespace std;
class Base
{
public:
virtual ~Base() {}
};
class Derived : public Base
{
public:
void show()
{
cout << "Derived" << endl;
}
};
int main()
{
Base base;
try
{
Derived& derived = dynamic_cast<Derived&>(base);
derived.show();
}
catch (const bad_cast& e)
{
cout << "Bad cast" << endl;
}
return 0;
}
Результат выполнения кода:
"Bad cast"
Смотрите также
-
оператор
static_cast,
который выполняет преобразование на этапе компиляции -
оператор
const_cast,
который снимает или добавляет константность -
оператор
reinterpret_cast,
который переинтерпретирует тип данных -
приведение в стиле C
c-cast,
которое объединяет разные виды преобразований