【问题标题】:Dynamic_cast not needing to perform a run-time check? [duplicate]Dynamic_cast 不需要执行运行时检查? [复制]
【发布时间】:2013-06-20 06:00:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ polymorphism dynamic-cast


    【解决方案1】:

    dynamic_cast 主要用于downcastcross-cast。陷阱提到了向上。

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

    • 上调:D* -> B1*, D* -> B2*
    • 垂头丧气:D*
    • 交叉转换:B1* B2*(如果您的最派生类是 D,则可以使用)。

    【讨论】:

      【解决方案2】:
      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)
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-24
        • 1970-01-01
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        相关资源
        最近更新 更多