Shi*_*hat 2 c++ virtual inheritance dynamic-cast visual-c++
我在c ++中经历了dynamic_cast概念.
假设我们有一个dynamic_cast和2个派生类class Base,class D1它们派生自class D2
Class Base,它有一个虚函数Base.
我的问题是:
1.upcast和downcast都可以在dynamic_cast中完成吗?
2.如果是,哪一个更优先,更有利.在这种情况下,我们可以在这方面进行贬低/上调?
3.是否推荐任何演员表或有害?
请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解.任何明确的解释都会非常有用.
提前致谢.
- 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";
}
}
Run Code Online (Sandbox Code Playgroud)
重要的是,所有上述代码都在指针或引用上运行.这是我们在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();
Run Code Online (Sandbox Code Playgroud)
Upcast是隐含的,你不需要为此使用任何强制转换.如果您明确希望将对象视为基类类型,请使用static_cast.
- 是不是建议使用任何演员表还是有害的?
往上看.有关详细信息,请阅读cppreference条目dynamic_cast.