RTTI(運行時類型識別)意思是運行時類型信息,它提供了運行時確定對象類型的方法。當同一個父類被多個不同的子類進行繼承,在子類中又定義了各自的成員函數時候,如何一個全局函數調用(為了實現能夠調用子類,其輸入參數為父類指針,即父類指針指向子類對象)。RTTI可以通過父類指針識別其所指向對象的真實數據類型。在該全局函數中實現通過對傳入對象類型的判斷,從而根據不同類型做出不同的反應,即調用不同的成員函數。
其中主要涉及的是typeid的使用,typeid的主要作用就是讓用戶知道當前的變量是什么類型的。使用例子如下:
Flyable *p =new Bird();//Flyable是父類,Bird是子類
cout<<typeid(p).name()<<endl;//class Flyable *
cout<<typeid(*p).name()<<endl;//class Bird
使用例子:
定義一個能夠移動(Movable)類,要求含有純虛函數move
定義一個公交車(Bus)類,繼承Movable類,並實現函數move,定義函數carry
定義一個坦克(Tank)類,繼承Movable類,並實現函數move,定義函數shot。
定義函數doSomething(Movable *obj),根據s指向對象的類型調用相應的函數。
實例化公交車類和坦克類,將對象傳入到doSomething函數中,調用相應函數
代碼如下:
#include <iostream> #include <stdlib.h> #include <string> using namespace std; /** * 定義移動類:Movable * 純虛函數:move */ class Movable { public: virtual void move()=0; }; /** * 定義公交車類:Bus * 公有繼承移動類 * 特有方法carry */ class Bus : public Movable { public: virtual void move() { cout << "Bus -- move" << endl; } void carry() { cout << "Bus -- carry" << endl; } }; /** * 定義坦克類:Tank * 公有繼承移動類 * 特有方法fire */ class Tank :public Movable { public: virtual void move() { cout << "Tank -- move" << endl; } void fire() { cout << "Tank -- fire" << endl; } }; /** * 定義函數doSomething含參數 * 使用dynamic_cast轉換類型 */ void doSomething(Movable *obj) { obj->move(); if(typeid(*obj) == typeid(Bus)) { Bus *bus = dynamic_cast<Bus*>(obj);//注意這兩個語句 bus->carry(); } if(typeid(*obj) == typeid(Tank)) { Tank *tank=dynamic_cast<Tank*>(obj);//注意這兩個語句 tank->fire(); } } int main(void) { Bus b; Tank t; doSomething(&b); doSomething(&t); cout<<typeid(b).name()<<endl;// cout<<typeid(t).name()<<endl;// return 0; }輸出結果:
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。