Может быть как upcast, так и downcast как с помощью dynamic_cast в C++

Я проходил через концепцию dynamic_cast в C++.

Допустим, у нас есть class Base и 2 производных класса class D1 а также class D2 которые получены из Base
Класс Base имеет виртуальную функцию fun(),
Мои вопросы:
1. Можно ли сделать upcast и downcast в dynamic_cast?
2. Если да. Какой из них более предпочтителен и выгоден? В каких случаях мы можем пойти на понижение / повышение в этом отношении?
3. Является ли какой-либо актерский состав не рекомендуемым или вредным?

Пожалуйста, объясните варианты использования для того же самого с учетом вышеупомянутых сценариев, чтобы получить более четкое представление об этом. Любое четкое объяснение было бы очень полезно.
Заранее спасибо.

1 ответ

Решение
  1. Можно ли сделать upcast и downcast в dynamic_cast?

Upcasting с dynamic_cast не имеет никакого смысла. Прогнозы всегда будут успешными. dynamic_cast используется, когда вы не уверены, удастся ли понизить рейтинг, и таким образом вы проверяете результат броска на успех.

Допустим, у вас есть функция f который занимает B& и должен решить, какой объект он получает:

void f(B& obj) {
    D1* d1 = dynamic_cast<D1*>(&b); // notice the address-of operator!
    if (d1 != nullptr)
        std::cout << "We got a D1!\n";
    else if (dynamic_cast<D2*>(&b) != nullptr) // No need to assign to a variable.
        std::cout << "We got a D2!\n";

    // Or, with a reference:
    try {
        D1& d1_ref = dynamic_cast<D1&>(b); // reference!
        std::cout << "We got a D1!\n";
    catch (std::bad_cast const&) {
        std::cout << "It was NOT a D1 after all\n";
    }
}

Важно отметить, что весь приведенный выше код работает с указателями или ссылками. Это то, что нам нужно сделать в C++ для работы с полиморфными объектами. Мы не можем просто использовать значения здесь.

  1. Если да. Какой из них более предпочтителен и выгоден? В каких случаях мы можем пойти на понижение / повышение в этом отношении?

В вашем случае у нас будет:

D1 derived;
B& b = derived; // implicit upcast
b.fun();

static_cast<B&>(derived).fun(); // explicit upcast

// But actually, no upcast is of course needed to call `fun`:
derived.fun();

Upcast неявный, вам не нужно использовать какой-либо каст для этого. Если вы явно хотите рассматривать объект как тип базового класса, используйте static_cast,

  1. Разве ни один актерский состав не рекомендуется или вреден?

Смотри выше. Для получения дополнительной информации прочитайте запись cppreference наdynamic_cast,

Другие вопросы по тегам