type_id_1 & dynamic_cast <type_-_id_2 &> (expression)
type_id_1 * dynamic_cast <type_-_id_2 *> (expression)
2) Если преобразование указателя expression невозможно то возвращается nullptr
class A{ // Базовый класс А
virtual void foo(){}; // Для dynamic_cast необходима виртуальная функция в родительском классе
};
class B : A{}; // Класс производный от А
int main(){
A* a = new A(); // Указатель на класс А (родительский)
B* b = new B(); // Указатель на класс В (дочерний)
b = dynamic_cast<B*> (a); // OK Возможно преобразование от базового класса к производному
b = a; // Ошибка! Прямое преобразование невозможно
a = dynamic_cast<A*> (b); // Ошибка! Преобразование невозможно от производного класса к базовому
a = b; // Ошибка! Прямое преобразование невозможно
b = (B*)a; // ОК приведение в стиле Си