RTTI(RunTime Type Information)执行时类型信息 具体解释

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24369987

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).

代码例如以下:

/*
* 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 fcn() {
std::cout << "base" << std::endl;
}
}; class Derived : public Base {
public:
virtual void fcn() override {
std::cout << "derived" << std::endl;
}
}; void fcnC(Base* p) {
p->fcn();
} void fcnD(Base& p) {
p.fcn();
} int main(void) {
Base* cp = new Derived;
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); Base& cr = *cp;
std::cout << typeid(&cr).name() << std::endl;
std::cout << typeid(cr).name() << std::endl;
fcnC(&cr);
fcnD(cr);
Base& dr = *dp;
fcnC(&dr);
fcnD(dr); return 0;
}

输出:

P4Base
7Derived
derived
derived
base
base
P4Base
7Derived
derived
derived
base
base

最新文章

  1. XCode与Git的完美融合,不再依赖其它Git客户端
  2. ngCordova插件安装使用
  3. json_decode详解
  4. [转]asp.net mvc 从数据库中读取图片
  5. Codeforces 741B:Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses(01背包+并查集)
  6. 使用Gson解析复杂的json数据
  7. 用Vmware安装centos5
  8. ios6-7以后用户开热点后的屏幕适配
  9. 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
  10. Java基础知识强化之集合框架笔记16:List集合的特有功能概述和测试
  11. 泛型,迭代器,LinkedList&lt;E&gt;
  12. 敏捷测试(6)--基于story的敏捷基础知识
  13. 关于单链表的增删改查方法的递归实现(JAVA语言实现)
  14. Angular记录(4)
  15. H5 20-属性选择器上
  16. javascript从作用域到闭包-笔记
  17. Python Django框架笔记(二):创建应用和django 管理
  18. Js_获取浏览器等高宽
  19. Bad update sites
  20. Codeforces Round #354 (Div. 2) C. Vasya and String 二分

热门文章

  1. java_udp编程
  2. caffe这个c++工程的目录结构
  3. spring的设计思想
  4. Kotlin – CharSequence IsNullOrBlank() vs IsNullOrEmpty()
  5. vim common usage
  6. JAVA基础——设计模式之装饰者模式
  7. RN code push自定义弹框
  8. JZOJ5776. 【NOIP2008模拟】小x游世界树
  9. CentOS虚拟机挂载Windows共享目录
  10. Python之字符串计算(计算器)