C語言中,存在強制類型轉換的概念。在C++中,C的作法一樣適用。可是,C++也有本身的類型轉換的方式,就是使用reinterpret_cast<>。例如,
安全
char* str = "chentong"; int* p = reinterpret_cast<int*>(str);
經過這種方式,就把指向char*類型的str,強制轉換成了指向int*。
ide
僅僅這樣作,是不夠的。由於,str指向的一個字符串,一個肯定的字符串,也就是說,要求是不可改寫,也就是可讀不可寫。因此,爲了達到這一目的,咱們將str指向的內容不可修改。操做以下:
函數
const char* str = "chentong";
這樣作後,確實,str所指向的內容不可修改了,可是,這樣作,又帶來一個問題,那就是,reinterpre_cast<>這種強制轉換,不能夠去掉相似與const這樣的屬性。因此,咱們要經過一些手段,將str的const屬性去掉。幸運的是,C++確實提供瞭解決方案。經過const_cast<>。代碼以下:
this
const char* str = "chentong"; char* str2 = const_cast < char* > ( str );
這樣一來,就去掉了str的const屬性。
spa
那麼,完整的操做方式,
指針
const char* str = "chentong"; char* str2 = const_cast < char* > ( str ); int* p = reinterpret_cast < char* > ( str2 );
這樣就完成了類型的轉換。
對象
接下來說一下動態類型轉換。首先得清楚的是,動態類型轉換,只能用於存在虛函數的類。假設我有三個類,
字符串
class Human { public: virtual void eating( void ) { cout << "use hand to eat" << endl; } }; class Englishman : public Human { public: //覆寫 void eating(void) { cout << "use knife to eat" << endl; } }; class Chinese : public Human { public: void eating(void) { cout << "use chopstick to eat" << endl; } };
而後我在global space中實現,對於不一樣國家的人有不一樣的吃飯方式這樣一個函數。
it
void test_eating(Human& h) { h.eating(); }
如今,我還想分辨這我的是英國人仍是中國人。那麼,我該怎麼作呢?ast
void test_eating(Human& h) { Englishman* pe = NULL; Chinese *pc = NULL; h.eating(); if ( pe == dynamic_cast < Englishman* > ( &h ) ); cout << "this is Englishman" << endl; if ( pc == dynamic_cast < Chinese* > ( &h ) ) cout << "this is Chinese" << endl; }
在test_eating()函數中,我先定義兩個變量,分別指向Englishman*和Chinese類型。那麼,它是如何動態轉換的呢?當一個類中有虛函數時,根據該類所建立的類對象中就會有一個指針,這個指針指向虛函數表,這個虛函數表中,含有類信息,根據這個類信息,就知道這個對象是屬於哪一個類的。因此,這個類信息就能夠肯定Human& h的h,是哪一個類的。
最後,靜態類型轉換static_cast<>在進行上行轉換時,是安全的。而在下行轉換時,沒有動態的檢查,因此是不安全的,只有你編寫代碼時去檢查是否符合邏輯。