我們在面向?qū)ο笾锌赡軙霈F(xiàn)這樣的情況:基類指針指向子類對象、基類引用成為子類對象的別名。如下
創(chuàng)新互聯(lián)是專業(yè)的福州網(wǎng)站建設(shè)公司,福州接單;提供網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行福州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
靜態(tài)類型便指的是變量(對象)自身的類型,動態(tài)類型是指指針(引用)所指向?qū)ο蟮膶嶋H類型?;愔羔樖欠窨梢詮娭祁愋娃D(zhuǎn)換為子類指針取決于動態(tài)類型!下面的這種轉(zhuǎn)換方式是危險的
那么我們在 C++ 中如何得到動態(tài)類型呢?解決方案便是利用多態(tài):1、在基類中定義虛函數(shù)返回具體的類型信息;2、所有的派生類都必須實現(xiàn)類型相關(guān)的虛函數(shù);3、每個類中的類型虛函數(shù)都需要不同的實現(xiàn)。
下來我們就用代碼來分析
#include#include 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 (b); d->print(); } cout << dynamic_cast (b) << endl; } int main() { Base b; Derived d; Child c; test(&b); test(&d); test(&c); return 0; }
我們利用強制類型轉(zhuǎn)換的時候,首先得考慮指向的對象是不是和需要轉(zhuǎn)換的對象是一致的,如果是則進行轉(zhuǎn)換。否則會翻車。我們看看編譯結(jié)果
我們看到只輸出了 Derived 類。我們之前說過,在進行繼承相關(guān)的轉(zhuǎn)換時,最好用 dynamic_cast關(guān)鍵字,下面我們將 test 函數(shù)中的注釋去掉,再來編譯看看
我們看到成功實現(xiàn)轉(zhuǎn)換的打印出了地址,沒成功的都為 0 了。我們利用多態(tài)成功的實現(xiàn)了動態(tài)類型的識別。但是有點小缺陷,就是必須從基類開始通過類型虛函數(shù),所有的派生類都必須重寫類型虛函數(shù),每個派生類的類型名必須唯一。
那么在 C++ 中是通過了類型識別關(guān)鍵字的,typeid 關(guān)鍵字用于獲取類型信息。typeid 關(guān)鍵字返回對應(yīng)參數(shù)的類型信息,它返回一個 type_info 類對象,當(dāng) typeid 的參數(shù)為 NULL 時將拋出異常。typeid 的注意事項:當(dāng)參數(shù)為類型時,返回靜態(tài)類型信息;當(dāng)參數(shù)為變量時,不存在虛函數(shù)表則返回靜態(tài)類型信息,存在虛函數(shù)表則返回動態(tài)類型信息。
下來還是以代碼為例來進行分析
#include#include #include 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 的信息應(yīng)該是一致的,所以應(yīng)該打印出 1。來看看編譯結(jié)果
我們來看看如果不定義虛函數(shù)呢,看看編譯結(jié)果
我們看到如果定義了虛函數(shù)的話,打印的便是動態(tài)類型的;沒定義的話,打印的便是靜態(tài)類型的。下來我們再用 BCC 編譯器來看看結(jié)果
我們看到 typeid 關(guān)鍵字在不同的編譯器上打印的行為是有點區(qū)別的。通過對類型識別的學(xué)習(xí),總結(jié)如下:1、C++ 中有靜態(tài)類型和動態(tài)類型的概念;2、利用多態(tài)能夠?qū)崿F(xiàn)對象的動態(tài)類型識別;3、typeid 是專用于類型識別的關(guān)鍵字,它能夠返回對象的動態(tài)類類型信息。
歡迎大家一起來學(xué)習(xí) C++ 語言,可以加我QQ:243343083。