C++學習筆記之RTTI(運行時類型識別)


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;
}
輸出結果:





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: