可以在 C++ 中使用 dynamic_cast 进行向上转型和向下转型

Can be upcast and downcast both done using dynamic_cast in C++

我正在研究 dynamic_cast c++ 中的概念。

假设我们有一个 class Base 和 2 个派生的 类 class D1class D2 派生自 Base。 Class Base 有一个虚函数 fun().

我的问题是:

  1. upcast 和 downcast 都可以用 dynamic_cast 完成吗?
  2. 如果是,哪个更受青睐和有利?在这方面我们可以在哪些情况下选择downcast/upcast?
  3. 是否有任何演员不推荐或有害?

考虑到上述情况,请用相同的用例进行解释,以便更清楚地了解这一点。任何明确的解释都会很有帮助。

  1. Is upcast and downcast can both be done in dynamic_cast?

dynamic_cast 向上转换毫无意义。 Upcast 总是会成功的。 dynamic_cast用于不确定是否会成功的向下转换,因此您检查转换结果是否成功。

假设你有一个函数 f,它接受一个 B& 并且必须决定它得到什么样的对象:

void f(B& b) {
    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. If yes., Which one is more preferred and advantageous.? In which cases we can go for downcast/upcast in this regard?

在你的情况下,我们有:

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 是隐式的,你不需要为此使用任何转换。如果您明确希望将对象视为基础 class 类型,请使用 static_cast.

  1. Is any of the cast is not recommended or harmful?

见上文。如需更多信息,请阅读 cppreference entry on dynamic_cast.