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是安全的!应该避免向下转型。
-
相关阅读:
MySQL高阶语句(一)
【数据结构】线段树
Ubuntu安装samba服务器
PC防锁屏定时工具
#21天学习挑战赛—深度学习实战100例#——乳腺癌识别
PW2330原厂规格书12V转5V,3.3V稳压电源芯片,1A-3安
医院PACS系统:三维多平面重建操作使用
C++所有容器的详细使用介绍
dl_model_param
如果开发“科技”一查通小程序软件查询添加剂信息是否有前途呢?
-
原文地址:https://blog.csdn.net/weixin_60720508/article/details/127123940