Dynamic_cast不需要执行运行时检查?

时间:2013-06-23 17:37:38

标签: c++ polymorphism dynamic-cast

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

  

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

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

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

2 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分:2)

dynamic_cast主要用于向下转换交叉投射。陷阱提到了上流。

结构B1,B2,D:B1,B2:

  • upcast:D * - &gt; B1 *,D * - &gt; B2 *
  • 向下转换:D *&lt; -B1 *,D *&lt; -B2 *
  • 交叉投射:B1 *&lt; - &gt; B2 *(如果您的派生类最多是D,则会起作用。)