RTTI

  • 运行期标识对象的型式信息
  • 优势:允许使用指向基类的指针或引用自如地操作派生类的对象
  • typeid:获取表达式的型式;type_info:型式信息类
  • 头文件:typeinfo

对象转型模板

  • dynamic_cast:动态转型
  • static_cast:静态转型
  • reinterpret_cast:复诠转型
  • const_cast:常量转型

typeid操作符与type_info类

type_info类

  • 编译器实现的动态型式信息型式
  • 用于在程序运行时保存数据对象的型式信息
  • 不能直接使用该类,只能通过typeid操作符
  • 调用成员函数name()可以获得类的名称

typeid操作符

//programmer类是Employee的派生类
#include <typeinfo>
Programmer P;
Employee &e = P;
//输出P实际类名的字符串“programmer”
cout << typeid(e).name() << endl;

dynamic_cast

动态转型的三种方式:

  向上转型:沿着类继承层次向基类转型

  向下转型:沿着类继承层次向派生类转型

  交叉转型:沿着类多重继承层次横向转型

指针的动态转型

  正确执行时,结果为指向目标类对象的指针

  错误执行时,结果为0/NULL(C++11:nullptr)

  

引用的动态转型

  正确执行时,结果为目标类对象的引用

  错误执行时,引发bad_cast异常

例子:假设软件公司包括程序员和经理两类职员,需要按照不同规则支付薪水和奖金,如何实现呢?

class Employee
{
public:
virtual void PaySalary();
virtual void PayBonus();
};
class Manager :public Employee
{
public:
virtual void PaySalary();
virtual void PayBonus();
};
class Programmer :public Employee
{
public:
virtual void PaySalary();
virtual void PayBonus();
};
class Company
{
public:
virtual void PayRoll(Employee *e);
virtual void PayRoll(Employee &e);
private:
vector<Employee *> _employees;//向量保存雇员
};
void Company::PayRoll(Employee *e)//版本1
{
//调用哪个成员函数,如何区分程序员和经理
e->PaySalary();
e->PayBonus();
}
void Company::PayRoll(Employee *e)//版本2
{
Programmer *p = dynamic_cast<Programmer *>(e);
if (p) //p确实指向程序员对象
{
p->PaySalary();
p->PayBonus();
}
else//p不指向程序员,不发奖金
{
e->PaySalary();
}
}
void Company::PayRoll(Employee &e)//版本3
{
try
{
Programmer &p = dynamic_cast<Programmer&>(e);
p.PaySalary();
p.PayBonus();
}
catch (std::bad_cast)
{
e.PaySalary();
}
}

C++学习笔记28:运行期型式信息的更多相关文章

  1. C++学习笔记29:运行期型式信息2

    static_cast 静态转型的用途 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式 一般用于非类型式的普通数据对象转型 静态转型的问题 不进行运行 ...

  2. thinking in java学习笔记:14章 类型信息

    14.2 Class 对象 https://github.com/zhaojiatao/javase 1.什么是Class对象,Class对象是用来做什么的? Class对象是java程序用来创建类的 ...

  3. 【视频编解码·学习笔记】11. 提取SPS信息程序

    一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...

  4. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  5. jvm虚拟机笔记<六> 运行期优化

    这节我们总结一下JVM运行期的优化问题. https://www.cnblogs.com/zhouyuqin/p/5224573.html JVM运行期优化 即时编译器(JIT) 编译对象与触发条件 ...

  6. 【视频编解码·学习笔记】13. 提取PPS信息程序

    PPS结构解析 与之前解析SPS方式类似 一.定义PPS类: 在3.NAL Unit目录下,新建PicParamSet.cpp和PicParamSet.h,在这两个文件中写入类的定义和函数实现. 类定 ...

  7. Kali学习笔记28:Burpsuite(下)

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 扫描: 上一篇介绍到了爬网,那么到这里我以及爬取了一个 ...

  8. C++学习笔记30:模板与型式参数化

    转型操作 接受目标型式作为模板参数 Programmer *p = dynamic_cast<Programmer*>(e) 模板工作原理 使用template<typename T ...

  9. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...

随机推荐

  1. EF6 CodeFirst 实践系列文章列表

    2015 Jul.16 EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一) 来自:wangweimutou 本系列源自对EF6 CodeFirst的探索 ...

  2. 多项目开发下的dll文件管理

    阅读目录: DS01:为什么要对生成的dll文件进行管理? DS02:首先介绍以下两个DOS命令 DS03:第一种实现方法(xcopy) DS04:第二种实现方法(attrib) DS05:分享一个有 ...

  3. background复合属性详解(上):background-image

    background复合属性是个很复杂的属性,花样非常多,比较神奇的是css3 中支持多图片背景了,这篇文章先讲讲background-image属性,其他背景属性会在后续的文章综合总结. 一.最基本 ...

  4. μC/OS-Ⅲ系统的任务切换和任务调度

    一.任务切换 在操作系统中当任务需要从一个任务切换到另外一个任务时,要将当前任务的现场保存到当前任务的堆栈中(当前任务现场主要指CPU相关寄存器),然后回复新任务的现场并执行新任务.这个叫做上下文切换 ...

  5. VScode调试Python

    第一步,确保装上了PYTHON扩展 然后打开文件夹(这个东西必须打开文件夹才能进行调试,不能打开一个文件就调试) 打开文件夹后,那里显示没有配置,这时需要你按下F5 弹出选择环境,点击Python 它 ...

  6. 4、jvm内存回收——器

    内存回收---->垃圾回收---->GC GC 三基础,一个综合G1 串行:单线程,回收暂停其他 并行:多线程,回收暂停其他 并发:多线程,回收不暂停?! 成功好说,失败Serial Ol ...

  7. CocoaPods介绍。如何安装Ruby环境,如何下载和安装CocoaPods?

    CocoaPods介绍? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其 ...

  8. Android开源框架:NineOldAndroid

    在android3.0以前的版本,要实现动画,一般是使用NineOldAndroid开源框架,之后,就可以直接使用android提供的animation API了. 仔细看过此开源框架后,可看出此框架 ...

  9. Bootstrap 3 模态框播放视频

    Bootstrap 3 模态框播放视频 I'm trying to use the Modal feature from Bootstrap 3 to show my Youtube video. I ...

  10. Linux下PHP的完全卸载

    如果想把PHP彻底的卸载干净,直接用yum的remove命令是不行的,而需要查看有多少rpm包,然后按照依赖顺序逐一卸载,在网上查了好多,都是通过  "rpm -qa | grep php& ...