查看: 168|回复: 3

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

[复制链接]
发表于 2016-10-17 16:22:20 | 显示全部楼层 |阅读模式 来自 甘肃
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 [i]  
#include   
      
      
using namespace std;  
      
class Base {  
public:  
    virtual void fcnA() {  
        std::cout (p);  
    if (dp != NULL)  
        dp->fcnB();  
    else
        p->fcnA();  
}  
      
void fcnD(Base* p) {  
    if (typeid(*p) == typeid(Derived)) {  
        Derived* dp = dynamic_cast(p);  
        dp->fcnB();  
    } else
        p->fcnA();  
}  
      
int main(void) {  
    Base* cp = new Derived;  
    std::cout
输出:
P4Base  
7Derived  
P4Base  
derived  
derived  
base  
base
以上代码只是示例,
更多精彩内容:http://www.bianceng.cn/Programming/cplus/
具体使用时, 避免使用dynamic_cast和typeid()去判断类型, 直接通过多态即可.
注意多态的绑定只能通过指针, 如fcnC(Base*), 或引用, 如fcnD(Base&), 实现动态绑定, 两者效果相同;
都会根据输入的类型,动态绑定虚函数(virtual function).
代码如下:
/*
* test.cpp
*
*  Created on: 2014.04.22
*      Author: Spike
*/
      
/*eclipse cdt, gcc 4.8.1*/
      
#include [i]  
#include   
      
      
using namespace std;  
      
class Base {  
public:  
    virtual void fcn() {  
        std::cout fcn();  
}  
      
void fcnD(Base& p) {  
    p.fcn();  
}  
      
int main(void) {  
    Base* cp = new Derived;  
    std::cout
输出:
P4Base  
7Derived  
derived  
derived  
base  
base  
P4Base  
7Derived  
derived  
derived  
base  
base
作者:csdn博客 Spike_King
卓航论坛免责声明
Discuz X 最新常见问题解决方案 https://bbs.piaoxian.net/thread-77402-1-1.html (出处: 飘仙建站论坛)
回复

使用道具 举报

发表于 2016-10-17 17:24:50 | 显示全部楼层 来自 印度尼西亚
路过,学习下
回复 支持 反对

使用道具 举报

发表于 2016-10-19 10:50:05 | 显示全部楼层 来自 北京
谢谢楼主,共同发展
回复 支持 反对

使用道具 举报

发表于 2016-10-21 00:21:25 | 显示全部楼层 来自 马来西亚
帮你顶下哈!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部