跳转到内容

C++/运算符

维基教科书,自由的教学读本
< C++

dynamic_cast是 C++ 中包含的四种类型转换操作符之一,它利用运行时类型识别(RTTI)特性在运行时检查并转换多态对象的类型。它的主要功能包括:

  • 从基类子对象指针得到最派生对象(most-derived object)指针:dynamic_cast<void*>(expr) 。expr 是一个指向某个最派生对象中的某个基类子对象的指针,dynamic_cast 可用于从 expr 得到其所属的最派生对象的指针。由于并不清楚最派生对象的静态类型,因此这种情况下只能返回一个 void* 类型的指针指向最派生对象。
  • 从基类对象指针或引用得到派生类指针或引用(向下转换,downcast):dynamic_cast<Derived*>(base_expr) 。这应该是使用 dynamic_cast 最常见的场景。此时 base_expr 是一个指向 Base 对象的指针,Derived 是一个派生自 Base 类的类型。dynamic_cast 将检查 base_expr 指向的 Base 对象是否是某个唯一的 Derived 对象的基类子对象。如果检查通过,dynamic_cast 将会返回这个唯一的 Derived 对象的指针。
  • 从一个类对象指针或引用得到另一个无直接关联的类对象指针或引用(侧向转换,sidecast):dynamic_cast<Left*>(right_expr) 。此时 right_expr 是一个指向 Right 类型对象的指针,程序希望将其转换为一个 Left 类型对象的指针,Left 和 Right 不构成继承关系。dynamic_cast 首先通过 right_expr 指针得到其所属的最派生对象的指针以及类型,并检查最派生对象是否有一个唯一的类型为 Left 的基类子对象。如果检查通过,dynamic_cast 将会返回这个唯一的 Left 对象的指针。