咱們在面向對象中可能會出現這樣的狀況:基類指針指向子類對象、基類引用成爲子類對象的別名。以下ios
靜態類型便指的是變量(對象)自身的類型,動態類型是指指針(引用)所指向對象的實際類型。基類指針是否能夠強制類型轉換爲子類指針取決於動態類型!下面的這種轉換方式是危險的ide
那麼咱們在 C++ 中如何獲得動態類型呢?解決方案即是利用多態:一、在基類中定義虛函數返回具體的類型信息;二、全部的派生類都必須實現類型相關的虛函數;三、每一個類中的類型虛函數都須要不一樣的實現。函數
下來咱們就用代碼來分析學習
#include <iostream> #include <string> using namespace std; class Base { public: virtual string type() { return "Base"; } }; class Derived : public Base { public: string type() { return "Derived"; } void print() { cout << "I'm Derived." << endl; } }; class Child : public Base { public: string type() { return "Child"; } }; void test(Base* b) { if( b->type() == "Derived" ) { Derived* d = static_cast<Derived*>(b); d->print(); } cout << dynamic_cast<Derived*>(b) << endl; } int main() { Base b; Derived d; Child c; test(&b); test(&d); test(&c); return 0; }
咱們利用強制類型轉換的時候,首先得考慮指向的對象是否是和須要轉換的對象是一致的,若是是則進行轉換。不然會翻車。咱們看看編譯結果spa
咱們看到只輸出了 Derived 類。咱們以前說過,在進行繼承相關的轉換時,最好用 dynamic_cast 關鍵字,下面咱們將 test 函數中的註釋去掉,再來編譯看看指針
咱們看到成功實現轉換的打印出了地址,沒成功的都爲 0 了。咱們利用多態成功的實現了動態類型的識別。可是有點小缺陷,就是必須從基類開始經過類型虛函數,全部的派生類都必須重寫類型虛函數,每一個派生類的類型名必須惟一。對象
那麼在 C++ 中是經過了類型識別關鍵字的,typeid 關鍵字用於獲取類型信息。typeid 關鍵字返回對應參數的類型信息,它返回一個 type_info 類對象,當 typeid 的參數爲 NULL 時將拋出異常。typeid 的注意事項:當參數爲類型時,返回靜態類型信息;當參數爲變量時,不存在虛函數表則返回靜態類型信息,存在虛函數表則返回動態類型信息。繼承
下來仍是以代碼爲例來進行分析圖片
#include <iostream> #include <string> #include <typeinfo> using namespace std; class Base { public: virtual ~Base() { } }; class Derived : public Base { public: void print() { cout << "I'm Derived." << endl; } }; class Child : public Base { public: string type() { return "Child"; } }; void test(Base* b) { const type_info& tb = typeid(*b); cout << tb.name() << endl; } int main() { int i = 0; const type_info& tiv = typeid(i); const type_info& tvv = typeid(int); cout << (tiv == tvv) << endl; cout << endl; Base b; Derived d; test(&b); test(&d); return 0; }
咱們打印 i 和 int 的信息應該是一致的,因此應該打印出 1。來看看編譯結果編譯器
咱們來看看若是不定義虛函數呢,看看編譯結果
咱們看到若是定義了虛函數的話,打印的即是動態類型的;沒定義的話,打印的即是靜態類型的。下來咱們再用 BCC 編譯器來看看結果
咱們看到 typeid 關鍵字在不一樣的編譯器上打印的行爲是有點區別的。經過對類型識別的學習,總結以下:一、C++ 中有靜態類型和動態類型的概念;二、利用多態可以實現對象的動態類型識別;三、typeid 是專用於類型識別的關鍵字,它可以返回對象的動態類類型信息。
歡迎你們一塊兒來學習 C++ 語言,能夠加我QQ:243343083。