static_cast和dynamic_cast可以執行指針到指針的轉換,或實例本身到實例本身的轉換,但不能在實例和指針之間轉換。static_cast只能提供編譯時的類型安全,而dynamic_cast可以提供運行時類型安全。舉個例子:
class a;class b:a;class c。
上面三個類a是基類,b繼承a,c和ab沒有關係。
有一個函數void function(a&a);
現在有一個對象是b的實例b,一個c的實例c。
function(static_cast<a&>(b)可以通過而function(static<a&>(c))不能通過編譯,因爲在編譯的時候編譯器已經知道c和a的類型不符,因此static_cast可以保證安全。
下面我們騙一下編譯器,先把c轉成類型a
b& ref_b = reinterpret_cast<b&>c;
然後function(static_cast<a&>(ref_b))就通過了!因爲從編譯器的角度來看,在編譯時並不能知道ref_b實際上是c!
而function(dynamic_cast<a&>(ref_b))編譯時也能過,但在運行時就失敗了,因爲dynamic_cast在運行時檢查了ref_b的實際類型,這樣怎麼也騙不過去了。
在應用多態編程時,當我們無法確定傳過來的對象的實際類型時使用dynamic_cast,如果能保證對象的實際類型,用static_cast就可以了。至於reinterpret_cast,我很喜歡,很象c語言那樣的暴力轉換:)
dynamic_cast:動態類型轉換
static_cast:靜態類型轉換
reinterpret_cast:重新解釋類型轉換
const_cast:常量類型轉換
專業的上面很多了,我說說我自己的理解吧:
synamic_cast一般用在父類和子類指針或應用的互相轉化;
static_cast一般是普通數據類型(如int m=static_cast<int>(3.14));
reinterpret_cast很像c的一般類型轉換操作
const_cast是把cosnt或volatile屬性去掉