为什么类的下行转换是不安全的_类型转换
[TOC]
# 靜態(tài)轉(zhuǎn)換
用于類(lèi)層次結(jié)構(gòu)中基類(lèi)(父類(lèi))和派生類(lèi)(子類(lèi))之間指針或引用的轉(zhuǎn)換
* 進(jìn)行上行轉(zhuǎn)換(把派生類(lèi)的指針或引用轉(zhuǎn)換成基類(lèi)表示)是安全的.
* 進(jìn)行下行轉(zhuǎn)換(把基類(lèi)指針或引用轉(zhuǎn)換成派生類(lèi)表示)時(shí),由于沒(méi)有動(dòng)態(tài)類(lèi)型檢查,所以是不安全的
* 用于基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把char轉(zhuǎn)換成int.這種轉(zhuǎn)換的安全性也要開(kāi)發(fā)人員來(lái)保證
## 基礎(chǔ)類(lèi)型轉(zhuǎn)換
~~~
char a = 'a';
//char->double
//static_cast(將轉(zhuǎn)換誰(shuí))
double b = static_cast(a);
cout << typeid(b).name() << endl;
~~~
## 有層次關(guān)系類(lèi)的指針或引用轉(zhuǎn)換
~~~
Father *f = NULL;
Son *s = NULL;
//向下轉(zhuǎn)型,不安全
Son *s1 = static_cast(f);
//向上轉(zhuǎn)型,安全
Father *f1 = static_cast(s);
~~~
## 引用轉(zhuǎn)換
~~~
Father f;
Son s;
Father &ref_f = f;
Son &ref_s = s;
//向上轉(zhuǎn)換,安全
static_cast(ref_s);
//向下轉(zhuǎn)換,不安全
static_cast(ref_f);
~~~
# 動(dòng)態(tài)轉(zhuǎn)換
* `dynamic_cast`主要用于類(lèi)層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換
* 在類(lèi)層次間進(jìn)行上行轉(zhuǎn)換時(shí),`dynamic_cast`和`static_cast`的效果是一樣的
* 在進(jìn)行下行轉(zhuǎn)換時(shí),`dynamic_cast`具有類(lèi)型檢查的功能,比`static_cast`更安全
**基礎(chǔ)類(lèi)型不能使用動(dòng)態(tài)轉(zhuǎn)換**
~~~
Father *f = NULL;
Son *s = NULL;
//向上轉(zhuǎn)換,安全
Father *f1 = dynamic_cast(s);
//向下轉(zhuǎn)換,不安全,會(huì)檢查,如果不是多態(tài)會(huì)報(bào)error
//Son *s1 = dynamic_cast(f);
Father *f2 = new Son();
Son *s2 = dynamic_cast(f2);
~~~
# 常量轉(zhuǎn)換
該運(yùn)算符用來(lái)修改類(lèi)型的const屬性
* 常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象;
* 常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來(lái)的對(duì)象;
**注意:不能直接對(duì)非指針和非引用的變量使用const_cast操作符去直接移除它的const.**
~~~
const int *p = NULL;
// const->不帶const
int *newP = const_cast(p);
int *pp = NULL;
const int* newPP = const_cast(pp);
~~~
# 重新解釋轉(zhuǎn)換
這是最不安全的一種轉(zhuǎn)換機(jī)制,最有可能出問(wèn)題。
主要用于將一種數(shù)據(jù)類(lèi)型從一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型。
它可以將一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),也可以將一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針.
~~~
int a = 10;
int *p = reinterpret_cast(a);
Father *f = NULL;
Other *o = reinterpret_cast(f);
~~~
總結(jié)
以上是生活随笔為你收集整理的为什么类的下行转换是不安全的_类型转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 克隆对象工具类_关于dorad
- 下一篇: java nanos_java命名空间j