static_cast
- 只提供编译时的类型检查,没有运行时类型检查。完全不相干类型之间的转换是不允许的,编译器会报错。
- 进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
- 虽然也允许进行下行转换(把基类指针或引用转换成子类表示)时,但由于没有动态类型检查,所以是不安全的。
- 用于基本数据类型之间的转换,支持占用不同存储空间的基本类型的转化,但这种转换的安全性也要开发人员来保证。
- 支持
void*
和目标类型间的相互转换。
dynamic_cast
- 有运行时类型检查。被转换的类型必须是多态类型,即必须
公有的
继承自其它类,或拥有虚函数(继承自其它类或自己定义的);因为是运行时类型检测,所以完全不相干类型间的转换也是允许的,编译器不会报错,但转换结果是NULL
。 - 根据第1条也就知道dynamic_cast不支持基本数据类型之间的转换。
- 同样根据第1条也就知道了dynamic_cast不支持将void*转换为目标类型,仅支持将目标类型转换为
void*
.
const_cast
- 移除const和volatile修饰符。
reinterpret_cast
reinterpret,美式发音为
[ˌriɪnˈtɜrprɪt]
- C++里的强制类型转换符。