dynamic_cast 只能用于继承体系下的转换,一般用于将基类转换为子类,需要考虑是不是设计有问题?有运行时检查,失败返回空指针。
const_cast用于去除对象的const/volatile属性,一般用于适应接口,且明确接口不会修改对象。
reinterpret_cast 重新表达,告诉编译器将这段内存解释为指定的数据类型。因为我们知道,类型只是告诉编译器如何解释一段内存,内存还是那个内存,数据还是那份数据,在二进制上,它们没有任何区别。类型只是辅助解释!参见A view of memory and fundamental data types in cpp. 不安全,尽量少用。但用得保证能用对。
static_cast 最常用,不做运行时检查,适合用在编译期就能确定安全、合理的类型转换场景。