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;
}
输出结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值