概念
dynamic_cast可以实现安全的下行转换或交叉转换。
使用
1 | dynamic_cast<type-id>(expression) |
原理解析
dynamic_cast 能够安全实现下行转换以及交叉转换的一个重要原因就是 C++ 多态原理。
多态
C++ 多态分为静态多态(编译时多态)和动态多态(运行时多态);
而上行转换及使用的静态多态,这种在编译期就明确的继承关系,使用 static_cast 与 dynamic_cast 的效果一样。
而在下行转换以及交叉转换时,则会用到动态多态,对于该类的运行时类型进行判断。
运行时类型
其中,对于 dynamic_cast 能够进行下行转换的一个重要条件,就是基类必须要有虚函数;
这里就不得不牵扯 C++ 的 RTTI 机制,即运行时类型识别,而类的 typeinfo 指针,里面记录了该类的类型信息和继承关系,存储在类的虚函数表中;
在进行动态类型识别时,取虚函数表中第 -1 个元素,得到 type_info 类对象判断其真正的类型再进行操作。