用法:express
static_cast < type-id > (expression)
安全
把expression
強制轉換爲type-id
類型,可是沒有運行時類型檢查。多用於void*的轉換。函數
用法:指針
dynamic_cast < type-id > (expression)
code
把expression
強制轉換爲type-id
類型,運行時進行類型檢查。對象
特性:繼承
在類層次間進行上行轉換(派生類的指針或引用轉換爲基類)時,dynamic_cast
和static_cast
的效果是同樣的;在進行下行轉換時,dynamic_cast
具備類型檢查的功能,比static_cast
更安全。io
dynamic_cast
支持交叉轉換。基類A有兩個直接派生類B、C,那麼,將B* pB
轉換爲C* pC
,這種由派生類B轉換到派生類C的轉換稱之爲交叉轉換。這種狀況下只能使用dynamic_cast
。編譯
dynamic_cast
支持多繼承ast
設有兩個基類A一、A2,派生類B從A一、A2中派生。
那麼,將pB轉換爲pA1或是pA2,此時只能使用dynamic_cast
,static_cast
是沒法實現此功能的。
即:單繼承狀況下,dynamic_cast
與static _cast
效果是相同的;多繼承狀況下,只能使用dynamic_cast
。
下行轉換中:
//B是基類,D是派生類 void func(B *pb) { D *pd1 = static_cast(pb); D *pd2 = dynamic_cast(pb); }
在上面的代碼段中,若是pb指向一個D類型的對象,pd1和pd2是同樣的,而且對這兩個指針執行D類型的任何操做都是安全的;
可是,若是pb指向的是一個B類型的對象,那麼pd1將是一個指向該對象的指針,對它進行D類型的操做將是不安全的(如訪問m_szName),
而pd2將是一個空指針。
另外:B要有虛函數,不然會編譯出錯,可是static_cast沒有這個限制
用法:
const_cast < type-id > (expression)
把常量指針轉化爲很是量指針,而且仍然指向原來的對象;常量引用被轉換成很是量引用,而且仍然指向原來的對象;常量對象被轉換成很是量對象。