通过RTTI,程序能够通过基类的指针或引用来检索其所指对象的实际类型。c++通过下面两个操作符提供RTTI。

(1)typeid:返回指针或引用所指对象的实际类型。

(2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用。

对于带虚函数的类,在运行时执行RTTI操作符,返回动态类型信息;对于其他类型,在编译时执行RTTI,返回静态类型信息。

在某些情况下不可能使用虚函数,在这种情况下,RTTI提供了可选机制。然而,这种机制比使用虚函数更容易出错:程序员必须知道应该将对象强制转换为哪种类型,并且必须检查转换是否成功执行。

注:使用动态强制类型转化要小心。只要有可能,定义和使用虚函数比直接接管类型管理好得多。

1、dynamic_cast操作符

dynamic_cast操作符将基类类型的指针或者引用安全转化为派生类类型的指针和引用。

如果dynamic_cast转换指针类型失败,则返回0;如果转换引用类型失败,则抛出一个bad_cast类型的异常。

dynamic_cast会首先验证转换是否有效,只有转换有效,操作符才进行实际的转换。

#include <iostream>
#include <typeinfo.h>
using namespace std;class Base//基类是多态类
{
public:virtual void f(){cout<<"Inside Base."<<endl;}
};
class Derived : public Base
{
public:void f(){cout<<"Inside Derived."<<endl;}
};void main()
{  cout<<"Start"<<endl; Base *bp,b_ob;Derived *dp,d_ob;//-------------------------------------dp=dynamic_cast<Derived*>(&d_ob);//派生类对象的指针“强制转换为”派生类对象的指针 OKif(dp){cout<<"Cast from Derived* to Derived* Ok."<<endl;dp->f();}elsecout<<"Error!"<<endl;//--------------------------------------bp=dynamic_cast<Base*>(&d_ob);//派生类对象的指针“强制转换为”基类对象的指针 OKif(bp){cout<<"Cast from Derived* to Base* OK."<<endl;bp->f();}elsecout<<"Error!"<<endl;//---------------------------------bp=dynamic_cast<Base*>(&b_ob);//基类对象的指针“强制转换为”基类对象的指针 OKif(bp){cout<<"Cast from Base* to Base* OK."<<endl;bp->f();}elsecout<<"Error!"<<endl;//-------------------------------------bp=dynamic_cast<Derived*>(&b_ob);//基类对象的指针“强制转换为”派生类对象的指针 Errorif(bp){cout<<"Cast from Base* to Base* OK."<<endl;bp->f();}elsecout<<"Cast from Base* to Base* not OK."<<endl;//=====================================================bp=&d_ob;dp=dynamic_cast<Derived*>(bp);//指向派生类的基类指针“强制转换为”派生类对象的指针 OKif(dp){cout<<"casting bp to a Drived* OK."<<endl;cout<<"because bp is really pointing to a Derived object."<<endl;dp->f();}else cout<<"Error!"<<endl;//-------------------------------------------------------bp=&b_ob;//bp指向基类型的对象dp=dynamic_cast<Derived*>(bp);//指向基类型对象的指针“强制转换为”派生类对象的指针 OKif(dp)cout<<"Error!"<<endl;else{cout<<"Now casting bp to a Drived* is not ok."<<endl;cout<<"because bp is really pointing to a Base object."<<endl;}//---------------------------------------------------------dp=&d_ob;//dp指向基类型的对象bp=dynamic_cast<Base*>(dp);//指向派生类型对象的指针“强制转换为”指向基类对象的指针 OKif(dp){cout<<"Casting dp to a base* is ok"<<endl;bp->f();}elsecout<<"Error"<<endl;cout<<"End"<<endl;
}

2、typeid操作符

typeid表达式形如:typeid(e)

这里e是任意表达式或者是类型名。

如果操作数不是类类型或者是没有虚函数的类,则获取其静态类型;如果操作数是定义了至少一个虚函数的类类型,则计算运行时类型。

typeid最常见的用途是比较两个表达式的类型,或者将表达式的类型与特定类型相比较。

Base *bp;
Derived *dp;
// compare type at run time of two objects
if (typeid(*bp) == typeid(*dp))
{// bp and dp point to objects of the same type
}
// test whether run time type is a specific type
if (typeid(*bp) == typeid(Derived))
{// bp actually points a Derived
}

引用文献:

http://blog.csdn.net/yjkwf/article/details/5514833

转载于:https://www.cnblogs.com/kona/p/4658661.html

[C++ primer]运行时类型识别(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. MFC六大核心机制之二:运行时类型识别(RTTI)

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

  7. c++远征之多态篇——运行时类型识别(RTTI)

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.RTTI(Run-Time Type Information),运行时类型识别. 涉及typeid.dynamic_cast这两个知识点. R ...

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

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

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

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

最新文章

  1. java 获取jsp路径_java如何获取jsp页面上传的文件路径
  2. 如何摧毁一个 Python 程序员?
  3. python进阶免费-菜鸟世界 -python进阶---生成器
  4. 安卓代码迁移:ActionBarActivity: cannot be resolved to a type
  5. 基本图形的光栅化算法
  6. Android SDK 目录说明
  7. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...
  8. 好看的二次元个人主页导航源码 动态背景+背景音乐
  9. vb不能插入png图片_收藏备用!!VBA操作图片【插入导出删除】
  10. jQuery 表单应用:全选/取消全选,表单验证,网页选项卡切换
  11. java俄罗斯方块程序_java基础俄罗斯方块
  12. 中兴笔试c语言,中兴c语言笔试题
  13. 16s测序 | 如何轻松发表文章
  14. [18调剂]北方民族大学2018年硕士研究生调剂公告
  15. python package dist-info
  16. nginx 学习笔记--Nginx正则表达式之匹配操作符
  17. 曙光服务器重装Linux,中科曙光服务器培训教程汇总:Linux系统管理和维护.pptx
  18. C#如何正确的释放资源
  19. 【渝粤教育】电大中专建筑施工技术_1作业 题库
  20. HashMap之Hash碰撞冲突解决方案及未来改进

热门文章

  1. 如何让脸部变得越来越白?
  2. 给92号油的汽车加95,为何老司机还说省钱?
  3. 内核如何为各种系统调用服务
  4. Javascript字符串长度返回错误的原因
  5. 传输层TCP(流量控制和拥塞控制)
  6. sql azure 语法_什么是Azure SQL Cosmos DB?
  7. xquery删除_XQuery实例删除SQL XML文档
  8. 在SQL Server中使用SQL Coalesce函数
  9. 使用Power BI Desktop可视化分析冠状病毒数据
  10. bpe编码_缓冲池扩展(BPE)–实施另一级缓存