C语言风格的强制类型转换不区分应用场景,C++中根据不同的应用场景提供了4种强制类型转换:
1.static_cast
静态类型转换,用来替代C语言风格的强制类型转换和隐式类型转换。
2.dynamic_cast
动态类型转换,应用在运行时的类型转换和识别,常用来将父类类型转换成子类类型。
3.const_cast
const类型转换,可以去除指针或引用的const属性,不能对常量使用const_cast。4.reinterpret_cast
非关联类型之间的转换,不推荐使用。
一,动态类型转换
动态强制类型转换在代码运行期间进行,动态强制类型转换的实现需要使用dynamic_cast运算符。
dynamic_cast运算符只能应用于多态类相关的指针和应用,且使用dynamic_cast的类需要至少包含一个虚函数。
dynamic_cast运算符的使用方式与static_cast运算符的方式相同,如果强制类型转换不成功,指针会被设置为nullptr。
基类指针只允许调用派生类的虚函数,而dynamic_cast运算符生成的指针可以调用非虚函数。
dynamic_cast运算符在类型转换期间不会改变指针的const属性,如果需要强制类型转换的指针是const类型的,则目标指针也必须是const类型的。
动态类型转换的情况分两种:
1.downcast方式:沿着类层次结构,向下进行强制类型转换,从基类的指针转换为派生类的指针。
2.crosscast方式:相同层次的不同类之间的强制类型转换。
二,dynamic_cast运算符使用介绍
dynamic_cast应用于指针类型的代码样式:
<type> *p_subclass = dynamic_cast<<type> *>( p_obj );
dynamic_cast应用于引用类型的代码样式:
<type> subclass = dynamic_cast<<type> &>( ref_obj );
对比一下C语言中的强制类型转换的写法:
Human* phuman = new Men;
Men* p = (Men*)(phuman);