dynamic_cast преобразование указателей или ссылок на объект

1) dynamic_cast применяется к объектам классов или структур
2) dynamic_cast преобразует указатель или ссылку на объект родительского класса, к указателю или ссылке на объект дочернего класса.

type_id_1 & dynamic_cast <type_-_id_2 &> (expression)
type_id_1 * dynamic_cast <type_-_id_2 *> (expression)
2) Если преобразование указателя expression невозможно то возвращается nullptr
3) Если преобразование ссылки expression невозможно то выбрасывается исключение std::bad_cast
4) Проверка правильности приведения типов производится во время выполнения программы (не во время компиляции, как в Си)
5) Чтобы преобразование было возможно, необходимо в родительском классе определить виртуальную функцию

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;                // ОК приведение в стиле Си
2023-10-22



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Оператор and альтернатива оператору "Логическое И" &&
Оператор and_eq - альтернатива оператору &= (Побитовое И)
asm ключевое слово С++. Включение блока кода на языке ассемблер в код С++.
auto C++, автоматическое вычисление компилятором типа переменной
bitand оператор С++ альтернативный "Побитовое И" &
bitor оператор языка С++ аналогичный "Побитовому ИЛИ" |
bool логический тип данных в С++
break оператор завершения ближайшего цикла или case в С++
case оператор С++ для выполнения блока кода при совпадении целочисленного значения в операторе switch
catch оператор С++ для ловли исключений
class ключевое слово C++ для задания класса
compl оператор C++ альтернативный "Побитовая инверсия" ~
const ключевое слово С++
consteval спецификатор С++20 указывающий что каждый вызов функции должен создавать константы времени компиляции
constexpr спецификатор С++11 означающий что значение переменной или результат работы функции должны рассчитываться на этапе компиляции
const_cast оператор приведения типов для добавления или удаления cv-квалификаторов С++
dynamic_cast С++ преобразование указателей или ссылок на объект
false C++, логическое "Ложно" C++
inline C++ вставка кода функции в месте вызова
Ключевые слова в С++
namespace С++ пространство имен
noexcept в C++
register С++ зарезервированное ключевое слово
return C++ выход из функции с возвратом результата
Выражения rvalue, lvalue, gvalue, xvalue, prvalue.
throw C++ принудительное выбрасывание исключений
true C++ логическое истинно и любое число кроме нуля
try C++ начинает блок кода в котором ловятся исключения
using C++ создание псевдонимов и импорт из пространства имен
volatile С++ запрет оптимизации объекта который может измениться извне