隐式类型转换是安全的,显式类型转换是有风险的。

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更安全。

posted on 2020-03-08 14:03  xiaobaizzZ  阅读(147)  评论(0编辑  收藏  举报