其它综合

RTTI学习笔记

我爱IT资讯库   2021/02/23

翻看C++的书,对RTTI的讲解都很困惑,"你知道你的对象是哪个类吗","RTTI常用于调试和数据库程序"对这些讲解本来就对"运行时类型识别"这个词很迷惑的我来说就更迷糊了.我认为还是C++ PRIMER这本书讲的很好.一开始就给出了答案:RTTI允许"用指向基类或引用来操纵对象"的程序能够获取到"这些指针所指对象"的实际派生类型.这句话虽然很苦涩难懂,但讲的再清楚不过了.RTTI就是对多态的类型转换的反操作,我讲的可能不是很标准.没有人家的讲的话那么严谨,呵呵.对RTTI基本使用dynamic_cast 和 typeid两种操作方式.


第一:dynamic_cast操作.无论怎么看书我对这个操作都很迷茫,越看越觉得有点懂还有点不懂.后来我仔细的思考后感觉dynamic_cast使用必须满足一个条件,就是所操纵的对象必须有一个虚函数.我知道C++中的对象实际上就是指向内存中的一些变量,而虚函数就是变量多一个函数指针.这样就得到答案:dynamic_cast实际上就是判断两个对象的虚函数指针是不是指向同一个函数地址.那么dynamic_cast就是一种强制类型转换操作,它提供一种安全的工作方式,可以将父类转换成子类.

dynamic_cast有指针判断和引用判断两种,下面用C++ PRIMER上的例子进行举例:

class employee{
public:
virtual int salary();
};
class programmer:public employee{
public:
int salary();
int bonus();
};
//使用指针
void company::payroll(employee *pe){
if (programmer *pm=dynamic_cast<programmer*>(pe))
{
pm->bonus();
}
}
//使用引用
void company::payroll(employee &re){
try
{
programmer &rm=dynamic_cast<programmer &>(re);
rm.bonus();
}
catch (std::bad_cast)
{
}
}


第二:typeid操作.对typeid的理解好象容易的多,它返回type_info这个类,根据书上的讲解,type_info这个类是编译器实现的,这个类根据不同的编译器会有不同的支持,包括比较两个对象,对象的类名,还会有函数清单,类型对象的内存布局等.那比较两个对象就可以用这个类实现更强大的功能.对于type_info这个类的使用我有很多疑问,它是跟类一起创建的?还是跟对象一起创建的?如果保存对象是不是也要保存thpe_info这个类对象呢?可是这些书上都没有答案。毕竟这是一本初级的书,可能需要到高级或实际编程中获得答案。type_info的构造函数是私有的,这个类必须由typeid才创建,那就说明typeid是type_info类的一个友元.但让我非常迷惑的是typeid写法.还是以C++ PRIMER上的例子的来说明.

#include <typeinfo>
employee *pe =new manager;
employee re=*pe;
//这里为什么不能用在RTTI呢
if(typeid(pe)==typeid(employee*))//true
if(typeid(pe)==typeid(manager*))//false
if(typeid(pe)==typeid(employee))//false
if(typeid(pe)==typeid(manager))//false
//这个还好理解吧
if(typeid(*pe)==typeid(manager))//true
if(typeid(*pe)==typeid(employee))//false
//这个也可以
if(typeid(re)==typeid(manager))//true
if(typeid(re)==typeid(employee))//false
//这里又不行了.
if(typeid(&re)==typeid(employee*))//true
if (typeid(&re)==typeid(manager*))//false


我对这样的写法很难理解,到底哪个写法是正确的呢经过我仔细的阅读才明白原来typeid不但可以用在RTTI上.还可以用在识别各种类,变量和常量上.用于识别它们的数据类型.比如C++ PRIMER上的例子:


int i;
cout<<typeid(i).name()<<endl;//打印:int
cout<<typeid(8.16).name()<<endl;//打印:double
class Bass{/*没有虚函数*/};
class Derived :public Bass{/*没有虚函数*/};
Derived dobj;
Bass *pb=&dobj;
cout<<typeid(*pb).name()<<endl;//打印:Base


那么怎么写才可以用在RTTI的类型转换上呢那就是表达式是一个类的类型.而不是一个类的指针.


上面对RTTI的学习笔记都写完了,也可能有理解错误的地方,在这里记录一下.方便今后使用的时候来阅读.





热门内容

使用axis2传输附件

服务端Service文件: import java.io.FileOutputStream; import jav... ...

sql server 的行转列

sql server中行转列在sql2005之后,sqlserver引入了pivot运算符,也即是可以旋转行为列,... ...
【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

【Node.js基础篇】(九)使用readline模块实现Node.js的输入输出

学C++的时候,有cout和cin,Java也有println和Scanner控件,Node.js也有如同... ...
iOS 应用支持4寸屏

iOS 应用支持4寸屏

iPhone 5出了,一大批应用要兼容新的分辨率,下载了Xcode 4.5,在官方那里找不到有关兼容新分辨... ...

循环执行oracle到mysql的迁移步骤及各种注意事项

改章节笔者在北京逛街的时候突然想到的...今天就有想写几篇关于循环执行的笔记,所以回家到之后就奋笔疾书的写出来发表了 ... ...
2015收获的季节

2015收获的季节

—————————————————————前言————————————————————— ———————... ...

JSP中的pageEncoding和contentType属性

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是js... ...

对XX证券报关于物联网操作系统的几个问题的答复

XX证券报提问了几个关于物联网和物联网操作系统的问题,个人表达了一些粗陋的观点,在这里发表出来,与行业朋友交流和探... ...
In语句优化

In语句优化

In语句的优化 现有两张表: CLINIC_ORGANISM 数据量:1400 LAB_DRUGRESISTITE... ...
fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

fuzzysearch, 在JavaScript中,快速而快速的模糊搜索

源代码名称:fuzzysearch源代码网址:http://www.github.com/bevacqua/fuzzys ...

SQL Server里的 ISNULL 与 NULLIF

SQL Server 中有两个参数,语法:     ISNULL(check_... ...

判断SD是否存在及其容量查询

这个非常简单,直接上代码: MainActivity: package com.home.getsdinf... ...

Python:如何排序(sort)

一、前言 python的列表(list)有两个排序方法: 一种是内建的list.sort()方法,可以直接改变列表的内容 ...

boost库在工作(5)作用域智能指针scoped_ptr之四

第二种情况,主要就是使用在调用异常抛出的函数的地方。如下面的例子: //异常抛出的函数,适合使用智能指针... ...

Error:couldnotopen`C:\ProgramFiles\Java\jre6\lib\i386\jvm.cfg'

昨天刚过情人节!哈哈,好久没记录学习内容了,今天在房子闲着没事重新安装jdk,按道理很简单的; 第一步下载jdk; ...

第49周二

晚上总结下今天,主要是在完善用户需求文档,同时看了jquery相关的操作技巧,主要是想学习jquery源码,在知乎jqu ...

C++ #include 和 using std::string

今天,偶尔写了一个小小的程序,关于字符串问题程序。 比如,我想连续打印用户输入的字符串。 #include&l... ...

Struts Hibernate Spring 经典面试题

Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Ses... ...

SAP Performance浅析

本文来源于:http://scnblogs.techweb.com.cn/tcsapbw/archives/106... ...

数据库MySQL与xls文件的互导

      最近的一个项目需要将xls表导入到MySQL数据库中和将MySQL数据表导出到... ...

Head-of-Line Blocking (线头阻塞)

Head of Line (HOL) Blocking 产生的原因: 概念:队列的首个packet由于它的目的... ...

Python set的高效利用

python set的应用   ... ...

CollectionFrameWork

collectionframework如下: collection ├list │├linkedlist │├array ...

JAVA访问修饰符构造函数的问题(转)

java访问修饰符 构造函数的问题 java访问修饰符-限定符总结(类比c#) java访问修饰符--------- ...

PAT甲1004CountingLeaves【dfs】

1004counting leaves(30 分) a family hierarchy is usually p ...

171.[LeetCode]Excel Sheet Column Number

题目: Related to question Excel Sheet Column Title ... ...

在.NET中获取一台电脑名,IP地址及当前用户名

在.NET中获取一台电脑名,IP地址及当前用户名是非常简单,以下是我常用的几种方法,如果大家还有其他好的方法,可以回复一... ...
sun directory server

sun directory server

Sun One Directory Server(LDAP)安装和调整指南   ... ...
黑客讲故事:攻下隔壁女生路由器后,我都做了些什么

黑客讲故事:攻下隔壁女生路由器后,我都做了些什么

路由器被蹭网后,我有被黑的风险吗? Evi1m0,来自知道创宇,邪红色信息安全组织创始人 其实这个问题可以... ...

oracle 10g for redhat5

解压文件 解压文件命令: unzip 10201_database_linux32.zip ... ...