C++学习笔记28:运行期型式信息
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:运行期型式信息的更多相关文章
- C++学习笔记29:运行期型式信息2
static_cast 静态转型的用途 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可以用于其他型式 一般用于非类型式的普通数据对象转型 静态转型的问题 不进行运行 ...
- thinking in java学习笔记:14章 类型信息
14.2 Class 对象 https://github.com/zhaojiatao/javase 1.什么是Class对象,Class对象是用来做什么的? Class对象是java程序用来创建类的 ...
- 【视频编解码·学习笔记】11. 提取SPS信息程序
一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- jvm虚拟机笔记<六> 运行期优化
这节我们总结一下JVM运行期的优化问题. https://www.cnblogs.com/zhouyuqin/p/5224573.html JVM运行期优化 即时编译器(JIT) 编译对象与触发条件 ...
- 【视频编解码·学习笔记】13. 提取PPS信息程序
PPS结构解析 与之前解析SPS方式类似 一.定义PPS类: 在3.NAL Unit目录下,新建PicParamSet.cpp和PicParamSet.h,在这两个文件中写入类的定义和函数实现. 类定 ...
- Kali学习笔记28:Burpsuite(下)
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 扫描: 上一篇介绍到了爬网,那么到这里我以及爬取了一个 ...
- C++学习笔记30:模板与型式参数化
转型操作 接受目标型式作为模板参数 Programmer *p = dynamic_cast<Programmer*>(e) 模板工作原理 使用template<typename T ...
- CUBRID学习笔记 28 执行sql脚本文件
一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...
随机推荐
- 15个实用的jQuery代码片
(function($) { var cache = []; // Arguments are image paths relative to the current page. $.preLoadI ...
- 为TIF、JPG图片添加地理坐标/平面直角坐标
图片分辨率.(X方向像素数numX,Y方向像素数numY) 步骤: (1)在放图片的目录下新建TXT文本文档,将文件名改为与图片相同,扩展名改为jgw(JPG图片),(TIF要改为tfw). (2)用 ...
- Android中的内容提供器
用途 不同于File, SharedPreferences和DataBase,Content Provider主要用于不同的应用程序间共享数据,允许一个程序安全的访问另一个程序中的数据. 用法 通过C ...
- c++内存对齐
内存对齐原则: 1.数据成员对齐规则:struct, union的数据成员,第一个数据成员放在offset为0的地方,之后的数据成员的存储起始位置都是放在该数据成员大小的整数倍位置.如在32bit的机 ...
- gif显示
public void gifplay(string path,ref Panel panel) { try{ Bitmap animatedGif = new Bitmap(path ); Grap ...
- 手把手教你在Ubuntu上安装Apache、MySql和PHP
1:首先安装apache:打开终端(ctrl+Alt+t), 输入命令:sudo apt-get install apache2即可安装, 安装完后,打开浏览器,在地址栏输入:localhost或者h ...
- android 在使用studio 编写百度地图中遇到APP Scode码校验失败 问题
直接用打包出来的apk查看签名,具体如下: 1) 将apk修改后缀为 .zip文件后解压: 2) 进入解压后的META-INF目录,该目录下会存在文件CERT.RSA 3) 在该目录下打开cmd,输入 ...
- SYS与SYSTEM、DBA与SYSDBA的区别
SYS与SYSTEM: 1. sys 的角色是sysdba system 的角色是sysoper 2. sys 具有create database的权限 system没有该权限 3. sys可以建数据 ...
- 导出Excel
一.asp.net中导出Execl的方法:在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器 ...
- mac idea中 maven项目添加的时候没有java文件
file --other setting --maven 选中第二项即可 apply下