隐式类型转换是安全的,显式类型转换是有风险的。
static_cast
"静态转换",也就是在编译期间转换,转换失败的话会抛出一个编译错误。
const_cast
将 const/volatile 类型转换为非 const/volatile 类型。
reinterpret_cast
仅仅是对二进制位的拷贝,不会借助已有的转换规则对数据进行调整。reinterpret_cast 可以认为是 static_cast 的一种补充,一些 static_cast 不能完成的转换,就可以用 reinterpret_cast 来完成。
dynamic_cast
其他三种都是编译时处理的,dynamic_cast是在运行时处理的,运行时要进行类型检查。
不能用于内置的基本数据类型的强制转换。
转换成功的话返回指向类的指针或引用,转换失败的话,则返回NULL。
使用dynamic_cast转换时,基类中一定要有虚函数,否则编译不通过。
原因:类中存在虚函数,就说明它有可能想要让基类指针指向派生类对象,此时转换才有意义。由于运行时类型检查需要类型信息,而这个信息存储在类的虚函数表中。
向上转型时,dynamic_cast和static_cast效果一样;向下转型时,dynamic_cast具有类型检查功能,比static_cast更安全。