1 繼承自C語(yǔ)言的強(qiáng)制類(lèi)型轉(zhuǎn)換
C語(yǔ)言強(qiáng)制類(lèi)型轉(zhuǎn)換
(類(lèi)型)待轉(zhuǎn)換值
2 C++新增的標(biāo)準(zhǔn)轉(zhuǎn)換
C++新增的標(biāo)準(zhǔn)轉(zhuǎn)換方法:
(1)static_cast<類(lèi)型>(待轉(zhuǎn)換值)
(2)dynamic_cast <類(lèi)型>(待轉(zhuǎn)換值)
(3)const_cast <類(lèi)型>(待轉(zhuǎn)換值)
(4)reinterpret_cast <類(lèi)型>(待轉(zhuǎn)換值)
3 兩種轉(zhuǎn)換結(jié)果大不相同
(1)C語(yǔ)言風(fēng)格的強(qiáng)制類(lèi)型轉(zhuǎn)換兴垦,不智能扁耐,不會(huì)轉(zhuǎn)變地址值库快。
說(shuō)明:以下舉例僅僅是舉例挣柬,在實(shí)際代碼中不應(yīng)該有這種危險(xiǎn)寫(xiě)法。
#include <iostream>
using namespace std;
int main()
{
?????A *pa = new A();
?????pa->f();
?????B* pb = (B*)pa; ????// C語(yǔ)言風(fēng)格的強(qiáng)制轉(zhuǎn)換
?????cout << "pa = " << pa << endl;
?????cout << "pb = " << pb << endl;
?????pb->f();
?????return 0;
}
結(jié)果如下:
可以看到坟冲,轉(zhuǎn)換前后的地址值壓根沒(méi)變磨镶,所以調(diào)的還是a的方法。此時(shí)如果使用指針pb調(diào)一個(gè)B類(lèi)有的而A類(lèi)沒(méi)有的方法樱衷,會(huì)崩潰棋嘲。
(2)C++語(yǔ)言風(fēng)格的強(qiáng)制類(lèi)型轉(zhuǎn)換矩桂,很智能,但是會(huì)出別的問(wèn)題痪伦。
相同的例子侄榴,只是把C風(fēng)格的強(qiáng)制轉(zhuǎn)換替換成C++風(fēng)格,如下:
#include <iostream>
using namespace std;
int main()
{? ? ?
????A *pa = new A();
????pa->f();
????B* pb = dynamic_cast<B*>(pa); ????// C++語(yǔ)言風(fēng)格的強(qiáng)制轉(zhuǎn)換
? ? cout << "pa = " << pa << endl;
? ? cout << "pb = " << pb << endl;
? ? pb->f();
? ? return 0;
}
結(jié)果网沾,pb->f()直接發(fā)生崩潰癞蚕,如下:
因?yàn)閐ynamic_cast是個(gè)動(dòng)態(tài)轉(zhuǎn)換辉哥。它認(rèn)為:父類(lèi)對(duì)象的指針轉(zhuǎn)成子類(lèi)指針桦山,就是nullptr。
Note1:
dynamic_cast用于父子類(lèi)型之間的轉(zhuǎn)換時(shí)醋旦,要求父類(lèi)型至少有一個(gè)virtual函數(shù)恒水。否則,編譯報(bào)錯(cuò)饲齐。
Note2:
類(lèi)對(duì)象是nullptr的時(shí)候钉凌,也可以調(diào)類(lèi)對(duì)象的函數(shù),但是有兩點(diǎn)要求:
(1)所調(diào)的函數(shù)不是虛函數(shù)
(2)函數(shù)里面沒(méi)有使用到成員變量
即捂人,不能使用this指針御雕,也不能使用動(dòng)態(tài)綁定。
Tips:
如果想要和C一樣的效果滥搭,在C++里面要用static_cast酸纲。上面的例子中,把dynamic_cast換成static_cast就和C語(yǔ)言轉(zhuǎn)換的效果一樣了瑟匆。