为什么类的下行转换是不安全的_类型转换
[TOC]
# 静态转换
用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换
* 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的.
* 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的
* 用于基本数据类型之间的转换,如把int转换成char,把char转换成int.这种转换的安全性也要开发人员来保证
## 基础类型转换
~~~
char a = 'a';
//char->double
//static_cast(将转换谁)
double b = static_cast(a);
cout << typeid(b).name() << endl;
~~~
## 有层次关系类的指针或引用转换
~~~
Father *f = NULL;
Son *s = NULL;
//向下转型,不安全
Son *s1 = static_cast(f);
//向上转型,安全
Father *f1 = static_cast(s);
~~~
## 引用转换
~~~
Father f;
Son s;
Father &ref_f = f;
Son &ref_s = s;
//向上转换,安全
static_cast(ref_s);
//向下转换,不安全
static_cast(ref_f);
~~~
# 动态转换
* `dynamic_cast`主要用于类层次间的上行转换和下行转换
* 在类层次间进行上行转换时,`dynamic_cast`和`static_cast`的效果是一样的
* 在进行下行转换时,`dynamic_cast`具有类型检查的功能,比`static_cast`更安全
**基础类型不能使用动态转换**
~~~
Father *f = NULL;
Son *s = NULL;
//向上转换,安全
Father *f1 = dynamic_cast(s);
//向下转换,不安全,会检查,如果不是多态会报error
//Son *s1 = dynamic_cast(f);
Father *f2 = new Son();
Son *s2 = dynamic_cast(f2);
~~~
# 常量转换
该运算符用来修改类型的const属性
* 常量指针被转化成非常量指针,并且仍然指向原来的对象;
* 常量引用被转换成非常量引用,并且仍然指向原来的对象;
**注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const.**
~~~
const int *p = NULL;
// const->不带const
int *newP = const_cast(p);
int *pp = NULL;
const int* newPP = const_cast(pp);
~~~
# 重新解释转换
这是最不安全的一种转换机制,最有可能出问题。
主要用于将一种数据类型从一种类型转换为另一种类型。
它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针.
~~~
int a = 10;
int *p = reinterpret_cast(a);
Father *f = NULL;
Other *o = reinterpret_cast(f);
~~~
为什么类的下行转换是不安全的_类型转换相关推荐
- 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式 ...
- Vue.JS项目输入框中使用v-model导致number类型值自动转换成string问题的解决方案
老文章了,目前用el-input v-model.number就能解决 很简单的操作,不知道当初在做什么,下文请直接忽略- Vue.JS项目中v-model导致输入框中number类型值自动转换成st ...
- java 类之间转换,java中类对象之间的类型转换
类似于基本数据类型之间的强制类型转换. 存在继承关系的父类对象和子类对象之间也可以 在一定条件之下相互转换. 这种转换需要遵守以下原则: 1.子类对象可以被视为是其父类的一个对象 2.父类对象不能被当 ...
- php中自动转换、强制转换、其他数据类型和bool转换
0x01 自动转换 运算过程需要的数据类型和提供的数据类型不一致,将数据类型转为自己需要的类型 <?phpheader('content-type:text/html;charset=utf-8 ...
- 类的自动转换和强制类型转换
类型转换 将一个标准类型变量的值赋值给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型. long count = 8; //int类型转换为long类型 doub ...
- android开发图片格式,Android程序开发如何处理图像格式类及图像转换
在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...
- Object 类的强制转换
文章目录 1.Object 类的强制转换 1.1Object 类型可以转换为什么类型? 1.2 Object [] 数组类存储对象 1.Object 类的强制转换 1.1Object 类型可以转换为什 ...
- C++ 学习笔记之---类的自动转换
参考自<C++ Primer Plus 6th Edition> 类的自动转换: 说明: C++允许程序员指定类之间进行转换的方式(含基本类型) 站在类的角度看问题,姑且分为&quo ...
- 【C#】类——里式转换
类是由面对对象程序设计中产生的,在面向结构的程序设计例如C语言中是没有类这个概念的!C语言中有传值调用和传址调用的两种方式!在c语言中,主方法调用方法,通过传递参数等完成一些操作,其中比较常用的的数据 ...
最新文章
- 步进电机红外遥控C语言程序,单片机红外遥控+步进电机+1602液晶显示c语言源程序...
- 《SAS编程与数据挖掘商业案例》学习笔记之八
- ab 模拟_Ab测试第二部分的直观模拟
- dede后台栏目管理文章统计数量和实际文章数不一致解决办法
- 顶级技术大咖,揭秘实时音视频开发的超级风口
- JS的基本语法知识概括(ECMA、DOM、BOM)
- 将来时态:I will fly - I'm going to fly - I'm flying_48
- 陈式心意混元太极拳功要
- leetcode力扣62. 不同路径
- uva 540 (Team Queue UVA - 540)
- 创建ubuntu根文件系统
- Linux 下把服务设置自启动
- Linux系统Ubuntu vim安装plugin
- 关于Vmware中的Ubuntu不断弹窗Num Lock的问题
- xp信息服务器iis5.0,XP中安装iis5.0/IIS6.0的详细操作方法步骤(图文教程)
- 数据结构算法实现及例题
- 阿里云公共DNS安全传输服务介绍(DoH/DoT)
- DVB信道编解码与调制解调
- 旋转矩阵(一):旋转矩阵能让什么东西旋转?
- Django配置163邮箱出现 authentication failed(535)错误解决方法
热门文章
- C语言经典例75-反转整数
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑤ ( 执行 init-android-libyuv.sh | 执行 init-android-soundtouch.sh )
- 【错误记录】NDK 配置错误 ( C/C++ debug|arm64-v8a : Could not get version from cmake.dir path )
- 【组合数学】生成函数 ( 性质总结 | 重要的生成函数 ) ★
- Android Studio开发配置NDK环境
- FIFO buffer 和普通buffer区别
- GIL(全局解释器锁)与互斥锁
- java stringBuilder的用法
- CRM WEB UI 04明细界面添加按钮
- 在Linux命令行下运行Matlab