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

时间:2015-02-12 10:22:03

标签: c++ visual-c++ inheritance virtual dynamic-cast

我在c ++中经历了dynamic_cast概念。

假设我们有一个class Base和2个派生类class D1class D2,它们来自Base。类Base具有虚函数fun()

我的问题是:

  1. 可以使用dynamic_cast
  2. 完成向上和向下转播
  3. 如果是,哪一个更优选和有利?在这种情况下,我们可以在这方面进行贬低/上调?
  4. 是否有任何演员不推荐或有害?
  5. 请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解。任何明确的解释都会非常有用。

1 个答案:

答案 0 :(得分:6)

  
      
  1. upcast和downcast都可以在dynamic_cast中完成吗?
  2.   

使用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. 如果是,哪一个更优先,更有利。在这种情况下,我们可以在这方面进行贬低/上调?
  2.   

在你的情况下,我们有:

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. 是不推荐任何演员表还是有害的?
  2.   

见上文。有关详细信息,请阅读cppreference entry on dynamic_cast