C++ - RTTI(RunTime Type Information)运行时类型信息 详解

RTTI, RunTime Type Information, 运行时类型信息, 是多态的主要组成部分, 
通过运行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口.
dynamic_cast<>可以 使基类指针转换为派生类的指针, 通过判断指针的类型, 可以决定使用的函数.
typeid(), 可以判断类型信息, 判断指针指向位置, 在多态中, 可以判断基类还是派生类.

代码:


/*

 * test.cpp

 *

 *  Created on: 2014.04.22

 *      Author: Spike

 */

 

/*eclipse cdt, gcc 4.8.1*/

 

#include <iostream>

#include <typeinfo>

 

 

using namespace std;

 

class Base {

public:

    virtual void fcnA() {

        std::cout << "base" << std::endl;

    }

};

 

class Derived : public Base {

public:

    virtual void fcnB() {

        std::cout << "derived" << std::endl;

    }

};

 

void fcnC(Base* p) {

    Derived* dp = dynamic_cast<Derived*>(p);

    if (dp != NULL)

        dp->fcnB();

    else

        p->fcnA();

}

 

void fcnD(Base* p) {

    if (typeid(*p) == typeid(Derived)) {

        Derived* dp = dynamic_cast<Derived*>(p);

        dp->fcnB();

    } else

        p->fcnA();

}

 

int main(void) {

    Base* cp = new Derived;

    std::cout << typeid(cp).name() << std::endl;

    std::cout << typeid(*cp).name() << std::endl;

    std::cout << typeid(&(*cp)).name() << std::endl;

    fcnC(cp);

    fcnD(cp);

    Base* dp = new Base;

    fcnC(dp);

    fcnD(dp);

 

    return 0;

}

输出:


P4Base
7Derived
P4Base
derived
derived
base
base
以上代码只是示例, 

具体使用时, 避免使用dynamic_cast<>和typeid()去判断类型, 直接通过多态即可.
注意多态的绑定只能通过指针, 如fcnC(Base*), 或引用, 如fcnD(Base&), 实现动态绑定,
 两者效果相同;
都会根据输入的类型,动态绑定虚函数(virtual function).
--------------------- 
作者:SpikeKing 
来源:CSDN 
原文:https://blog.csdn.net/caroline_wendy/article/details/24369987 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值