Может быть как 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 ответ
- Можно ли сделать 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++ для работы с полиморфными объектами. Мы не можем просто использовать значения здесь.
- Если да. Какой из них более предпочтителен и выгоден? В каких случаях мы можем пойти на понижение / повышение в этом отношении?
В вашем случае у нас будет:
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
,
- Разве ни один актерский состав не рекомендуется или вреден?
Смотри выше. Для получения дополнительной информации прочитайте запись cppreference наdynamic_cast
,