跳转到内容

C++ 编程

来自维基教科书,开放世界中的开放书籍

dynamic_cast 关键字用于将数据从一个多态类型的指针或引用转换为另一个,类似于 static_cast,但会在运行时执行类型安全检查以确保转换的有效性。通常用于以安全的方式将指针或引用向上转换继承链(继承层次结构),包括执行所谓的交叉转换

语法
    TYPE& dynamic_cast<TYPE&> (object);
    TYPE* dynamic_cast<TYPE*> (object);

目标类型必须是指针或引用类型,表达式必须计算为指针或引用。

如果您尝试转换为指针类型,而该类型不是参数对象的实际类型,则转换结果将为 NULL

如果您尝试转换为引用类型,而该类型不是参数对象的实际类型,则转换将抛出 std::bad_cast 异常。

当它不失败时,dynamic_cast 返回目标类型指向表达式引用的对象的指针或引用。

  struct A {
    virtual void f() { }
  };
  struct B : public A { };
  struct C { };

  void f () {
    A a;
    B b;

    A* ap = &b;
    B* b1 = dynamic_cast<B*> (&a);  // NULL, because 'a' is not a 'B'
    B* b2 = dynamic_cast<B*> (ap);  // 'b'
    C* c = dynamic_cast<C*> (ap);   // NULL.

    A& ar = dynamic_cast<A&> (*ap); // Ok.
    B& br = dynamic_cast<B&> (*ap); // Ok.
    C& cr = dynamic_cast<C&> (*ap); // std::bad_cast
  }

华夏公益教科书