C++-dynamic_cast下行转换原理

概念

dynamic_cast可以实现安全的下行转换或交叉转换。

使用

1
dynamic_cast<type-id>(expression)

原理解析

dynamic_cast 能够安全实现下行转换以及交叉转换的一个重要原因就是 C++ 多态原理。

多态

C++ 多态分为静态多态(编译时多态)和动态多态(运行时多态);

而上行转换及使用的静态多态,这种在编译期就明确的继承关系,使用 static_cast 与 dynamic_cast 的效果一样。

而在下行转换以及交叉转换时,则会用到动态多态,对于该类的运行时类型进行判断。

运行时类型

其中,对于 dynamic_cast 能够进行下行转换的一个重要条件,就是基类必须要有虚函数;

这里就不得不牵扯 C++ 的 RTTI 机制,即运行时类型识别,而类的 typeinfo 指针,里面记录了该类的类型信息和继承关系,存储在类的虚函数表中;

在进行动态类型识别时,取虚函数表中第 -1 个元素,得到 type_info 类对象判断其真正的类型再进行操作。