4

引用 C++ Gotchas 中的第 45 项:

首先,dynamic_cast 不一定是动态的,因为它可能不执行运行时检查。当从派生类指针(或引用)到其公共基类之一执行 dynamic_cast 时,不需要运行时检查,因为编译器可以静态确定强制转换将成功。当然,在这种情况下不需要任何类型的转换,因为从派生类到其公共基类的转换是预定义的。

我认为上面的描述是通常使用 dynamic_cast 的地方(因此会进行运行时检查??)。

有人可以解释一下上述引用与使用 dynamic_cast 的“典型”需要之间的区别吗?这让我对何时需要使用 dynamic_cast 以及为什么不需要在上述场景中使用它感到困惑。

4

2 回答 2

4
class Base {
public:
    virtual ~Base() {}
    // ...
};

class Derived : public Base {
    // ...
};

“典型用途”:

void foo(Derived*);

void f(Base* pb)
{
    if (Derived* pd = dynamic_cast<Derived*>(pb)) {
        foo(pd);
    }
}

“以上报价”:

void bar(Base*);

void f(Derived* pd)
{
    Base* pb = dynamic_cast<Base*>(pd); // the dynamic_cast is useless here
                                        //  because a Derived IS-A Base, always
    bar(pb); // Note: could as well call directly bar(pd); (implicit conversion)
}
于 2013-06-23T17:48:11.690 回答
2

dynamic_cast多用于向下投射和交叉投射。陷阱提到了向上。

具有结构 B1、B2、D:B1、B2:

  • 上调:D* -> B1*, D* -> B2*
  • 垂头丧气:D* <- B1*, D* <- B2*
  • cross-cast: B1* <-> B2* (如果您的派生类是 D,则可以使用)。
于 2013-06-23T17:47:43.680 回答