寫這個(gè)隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉(zhuǎn)換時(shí)的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉(zhuǎn)子類、用 static_cast 子類轉(zhuǎn)父類、使用
在C++中,static_cast和dynamic_cast用于子類和父類指針之間的轉(zhuǎn)換。本文將詳細(xì)探討這兩種轉(zhuǎn)換的使用方法和注意事項(xiàng)。首先,我們將分別分析static_cast和dynamic_cast在父類指針和子類指針之間的四種轉(zhuǎn)換組合。
1. static_cast:父類指針轉(zhuǎn)換為子類指針:可以轉(zhuǎn)換,不會報(bào)錯(cuò),但存在安全風(fēng)險(xiǎn)。
2. static_cast:子類指針轉(zhuǎn)換為父類指針:可以轉(zhuǎn)換,不會報(bào)錯(cuò),是安全的。
3. dynamic_cast:父類指針轉(zhuǎn)換為子類指針:
a)若父類中沒有虛函數(shù),無法轉(zhuǎn)換,會在編譯時(shí)報(bào)錯(cuò);
b)若父類至少有一個(gè)虛函數(shù),則可以轉(zhuǎn)換,不會報(bào)錯(cuò)。但:
b.1)若父類指針指向的確實(shí)是一個(gè)子類對象,則dynamic_cast返回該子類對象的地址;
b.2)若父類指針指向的是父類對象,則dynamic_cast返回空指針nullptr;
4. dynamic_cast:子類指針轉(zhuǎn)換為父類指針:可以轉(zhuǎn)換,不會報(bào)錯(cuò),是安全的。
綜合來看,無論是使用static_cast還是dynamic_cast,將子類指針轉(zhuǎn)換為父類指針都是安全且允許的(上述2、4)。因此,static_cast和dynamic_cast都可以安全使用。
接下來,我們來探討上述1、3情況。實(shí)際上,static_cast相當(dāng)于程序員對編譯器做出的一種承諾:我們清楚地知道這種轉(zhuǎn)換可能存在的風(fēng)險(xiǎn),并且能夠接受這種風(fēng)險(xiǎn)。因此,當(dāng)我們使用static_cast將父類指針轉(zhuǎn)換為子類指針時(shí),編譯器不會報(bào)錯(cuò)。而dynamic_cast是在運(yùn)行時(shí)執(zhí)行類型轉(zhuǎn)換,用于將基類的指針安全地轉(zhuǎn)換為派生類的指針,即進(jìn)行動態(tài)類型檢查。dynamic_cast為程序員提供了一種安全的機(jī)制,使得程序員能夠安全地使用父類指針的動態(tài)類型。
下面我們來舉一個(gè)使用dynamic_cast(上述3中的b)的例子。首先,給出父類和子類的定義:
若有以上類的定義:
代碼1:
輸出:失敗。因?yàn)樵趧討B(tài)運(yùn)行時(shí),pb指向的是父類對象,而不是子類對象。
代碼2:
輸出:成功。
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動態(tài)代理的對比分析
閱讀Win11筆記本“自動管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)