以下内容源于慕课网的学习整理,如有侵权,请告知删除。

1、RTTI(Run-Time Type Information),运行时类型识别。

  • 涉及typeid、dynamic_cast这两个知识点。
  • RTTI技术可以通过父类指针,识别其所指向对象的真实数据类型。

2、如下面的例子

  • 首先是一些类的定义

  • 我们希望在一个函数里,根据不同的类的对象,进行不同的操作,如下
  • 涉及到了typeid和dynamic_cast的用法。

3、上面例子的细节

(1)dynamic_cast的注意事项

  • 只能应用于指针和引用的转换,即()中是指针或者引用;
  • 要转换的类型中必须包含虚函数,即< >中所对应的类中应该包含虚函数。
  • 转换成功返回子类的地址,失败返回NULL。即< >中的类,应该是()中的类的子类。

(2)typeid的注意事项

  • typeid返回一个type_info对象的引用;
  • 如果想要通过基类的指针获得派生类的数据类型,基类必须带有虚函数。
  • 只能获取对象的实际类型。
  • 上面代码中*obj表示一个对象的类型?比如是Bird或者Plane类型。
  • 因此typeid(*obj).name()得到类型,如Bird或者Plane。

4、代码示例

#include <iostream>
#include <stdlib.h>
#include <string>
#include <typeinfo>
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;}virtual void carry(){cout << "Bus -- carry" << endl;}
};/*** 定义坦克类:Tank* 公有继承移动类* 特有方法fire*/
class Tank :public Movable
{
public:virtual void move(){cout << "Tank -- move" << endl;}virtual 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);return 0;
}

c++远征之多态篇——运行时类型识别(RTTI)相关推荐

  1. VC6启用运行时类型识别 (RTTI)

    在程序中,当我们对多态类的基类指针使用typeid,就可以在运行时确定指针指向对象的实际类型,并输出对象类型的名字. #include  < cstdlib >  #include  &l ...

  2. java 运行时类型_Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  3. 白话C++系列(27) -- RTTI:运行时类型识别

    http://www.cnblogs.com/kkdd-2013/p/5601783.html RTTI-运行时类型识别 RTTI:Run-Time Type Identification. 那么RT ...

  4. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  5. Java RTTI运行时类型识别

    RTTI(Run-Time Type Identification),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作 ...

  6. RTTI机制(运行时类型识别)

    RTTI机制(运行时类型识别) 在多态里面,基类里的虚函数和派生类里的虚函数形成了遮蔽,这就导致在主程序运行时,有些表达式的类型没有办法确定.必须等到程序运行结束后,根据具体的环境才能确定.看下面的代 ...

  7. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  8. 深入浅出MFC学习笔记:MFC六大关键技术仿真之RTTI运行时类型识别

    RTTI(运行时类型识别) 参考文献:深入浅出MFC-侯捷 怎样去构造类别型录网? 一.定义数据结构: 其中pFirstClass指针属于痊愈变量,所以它应该以static修饰之. 而且我们最终希望达 ...

  9. C++11 的 运行时类型识别type_info

    一.type_info与typeid 类type_info保存关于类型的特定于实现的信息,包括类型的名称,以及比较两个类型是否相等或排序顺序的方法. 这是typeid操作符返回的类.具有如下特点: ( ...

最新文章

  1. Entity Framework在WCF中序列化的问题
  2. Linux进程编程(PS: exec族函数、system、popen函数)
  3. Codeforces Round #666 (Div. 2)
  4. python中mean的用法_Python statistics mean()用法及代码示例
  5. scala (2) while 和变量
  6. SpringSecurity-1-UserDetailsService接口
  7. 盒子模型(W3C盒子和IE盒子)
  8. 机器视觉对印刷业的影响
  9. java 重定向和转发的区别
  10. duilib消息类型
  11. ccf中文期刊目录_中国计算机学会CCF推荐中文科技期刊目录
  12. 基于Matpower的电力系统潮流计算仿真
  13. 工具包diffmerge
  14. Arcgis应用(十二)栅格数据翻转(Flip)、镜像(Mirror)、重缩放(Rescale)、旋转(Rotate)、移位(Shift)、弯曲(Warp)
  15. 设备巡检的痛点和巡检方案
  16. 国密Fabric-ca集群负载均衡
  17. Java编写一个公司员工类
  18. 计算机主机箱进行总结,工业级主机用机箱分类总结
  19. 若依前后端分离版:增加新的登录接口,用于小程序或者APP获取token,并使用若依的验证方法
  20. Python处理空间地理数据

热门文章

  1. git push 提交时显示 Empty reply from server的解决办法
  2. UIBarbuttonItem
  3. 在线MSN代码(如同QQ在线咨询那种的)
  4. 设计模式 之 创建者
  5. c#中的常用ToString()方法总结。
  6. 烂泥:mysql数据库使用的基本命令
  7. Sublime 解决目录显示为方块的问题
  8. python 文本处理2
  9. 支持向量机-SVM-最优化公式推导记录
  10. 喜讯,Asp.net Ajax 文档提供下载