static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用 static_cast,但它不能用于两个不相关的类型进行转换
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。(不相近类型转换)
- int a = 1;
- int* p = &a;
- a = reinterpret_cast<int>p;
const_cast最常用的用途就是删除变量的const属性,方便赋值
- void Test ()
- {
- const int a = 2;
- int* p = const_cast< int*>(&a );
- *p = 3;
- }
- //这里虽然可以改变a为3,但是仍然打印2!因为const修饰的变量a在编译时就被放到
- //了符号表中,只要是用到a就会被2替换,类似#define。如果想要打印出3:
-
- void Test ()
- {
- volatile const int a = 2;
- int* p = const_cast< int*>(&a );//volatile表示在用到a时,强制到内存中拿a的值,
- //而不是在符号表中拿
- *p = 3;
- }
4.dynamic_cast
dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
注意: 1. dynamic_cast只能用于父类含有虚函数的类.
2.dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
- void fun(A* pa)
- {
- B* ptr = dynamic_cast(pa);
- //B* ptr = reinterpret_cast(pa);
- //B* ptr = (B*)pa;
-
- if (ptr)
- {
- cout << "转换成功" << ptr << endl;
- }
- else
- {
- cout << "转换失败" << ptr << endl;
- }
- }
-
- int main()
- {
- A a;
- B b;
-
- fun(&a);
- fun(&b);
-
- return 0;
- }

- void fun(A* pa)
- {
- //B* ptr = dynamic_cast(pa);
- B* ptr = reinterpret_cast(pa);
- //B* ptr = (B*)pa;
-
- if (ptr)
- {
- cout << "转换成功" << ptr << endl;
- }
- else
- {
- cout << "转换失败" << ptr << endl;
- }
- }
-
- int main()
- {
- A a;
- B b;
-
- fun(&a);
- fun(&b);
-
- return 0;
- }

所以说dynamic_cast是安全的!应该避免向下转型。
-
相关阅读:
【Django 04】Serialization 序列化的高级使用
若依中脱敏
Python中[-1]、[:-1]、[::-1]、[n::-1]、[:,:,0]、[…,0]、[…,::-1] 的理解
AI落地制造业:智能机器人应具备这4种能力
驱动开发:内核枚举DpcTimer定时器
CSS入门
MyBatisPlus入门篇2 - 条件查询、查询投影、查询条件、id生成策略、多记录操作、逻辑删除
SQL语句之in操作符
JAVA12_06学习总结(JDBC,工具类优化)
边缘计算显现更多硬核价值——车企应用场景探索
-
原文地址:https://blog.csdn.net/weixin_60720508/article/details/127123940