寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用
在C++中,static_cast和dynamic_cast用于子類和父類指針之間的轉換。本文將詳細探討這兩種轉換的使用方法和注意事項。首先,我們將分別分析static_cast和dynamic_cast在父類指針和子類指針之間的四種轉換組合。
1. static_cast:父類指針轉換為子類指針:可以轉換,不會報錯,但存在安全風險。
2. static_cast:子類指針轉換為父類指針:可以轉換,不會報錯,是安全的。
3. dynamic_cast:父類指針轉換為子類指針:
a)若父類中沒有虛函數,無法轉換,會在編譯時報錯;
b)若父類至少有一個虛函數,則可以轉換,不會報錯。但:
b.1)若父類指針指向的確實是一個子類對象,則dynamic_cast返回該子類對象的地址;
b.2)若父類指針指向的是父類對象,則dynamic_cast返回空指針nullptr;
4. dynamic_cast:子類指針轉換為父類指針:可以轉換,不會報錯,是安全的。
綜合來看,無論是使用static_cast還是dynamic_cast,將子類指針轉換為父類指針都是安全且允許的(上述2、4)。因此,static_cast和dynamic_cast都可以安全使用。
接下來,我們來探討上述1、3情況。實際上,static_cast相當于程序員對編譯器做出的一種承諾:我們清楚地知道這種轉換可能存在的風險,并且能夠接受這種風險。因此,當我們使用static_cast將父類指針轉換為子類指針時,編譯器不會報錯。而dynamic_cast是在運行時執(zhí)行類型轉換,用于將基類的指針安全地轉換為派生類的指針,即進行動態(tài)類型檢查。dynamic_cast為程序員提供了一種安全的機制,使得程序員能夠安全地使用父類指針的動態(tài)類型。
下面我們來舉一個使用dynamic_cast(上述3中的b)的例子。首先,給出父類和子類的定義:
若有以上類的定義:
代碼1:
輸出:失敗。因為在動態(tài)運行時,pb指向的是父類對象,而不是子類對象。
代碼2:
輸出:成功。