我在c ++中经历了dynamic_cast
概念。
假设我们有一个class Base
和2个派生类class D1
和class D2
,它们来自Base
。类Base
具有虚函数fun()
。
我的问题是:
dynamic_cast
请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解。任何明确的解释都会非常有用。
答案 0 :(得分:6)
- upcast和downcast都可以在dynamic_cast中完成吗?
醇>
使用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 entry on dynamic_cast
。