Dynamic_cast不需要执行运行时检查

Dynamic_cast not needing to perform a run-time check?

本文关键字:运行时 检查 执行 不需要 cast Dynamic      更新时间:2023-10-16

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

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

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

有人能解释一下上面的引用和使用dynamic_cast的"典型"需求之间的区别吗?这让我很困惑,我什么时候需要使用dynamic_cast,以及为什么在上面的场景中不需要使用它。

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)
}

dynamic_cast主要用于下播交叉播。gotcha提到了upcast。

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

  • 上行:D*->B1*,D*->B2*
  • 下行:D*<-B1*、D*<-B2*
  • 交叉铸造:B1*<->B2*(如果你最派生的类是D,则会起作用)