可以使用C++中的dynamic_cast完成上传和下传

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.是否推荐任何演员表或有害?

请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解.任何明确的解释都会非常有用.
提前致谢.

Kon*_*lph 7

  1. 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++中需要做的事情来处理多态对象.我们不能在这里使用价值观.

  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();
Run Code Online (Sandbox Code Playgroud)

Upcast是隐含的,你不需要为此使用任何强制转换.如果您明确希望将对象视为基类类型,请使用static_cast.

  1. 是不是建议使用任何演员表还是有害的?

往上看.有关详细信息,请阅读cppreference条目dynamic_cast.

  • @ShivarajBhat:这非常有用,例如,在“好奇重复模板模式”(CRTP-http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)中,派生类继承自派生类所来自的类模板作为模板参数传递,基类通过“ static_cast”(使用模板参数派生类类型)将其“ this”传递给派生类来调用派生类的非虚拟方法。这是ATL和WTL所依赖的支柱之一。 (2认同)