RTTI和typeid操作符.ppt_第1页
RTTI和typeid操作符.ppt_第2页
RTTI和typeid操作符.ppt_第3页
RTTI和typeid操作符.ppt_第4页
RTTI和typeid操作符.ppt_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第17章 RTTI、类型转换操作符、typeid,RTTI,是RunTime Type Identification的缩写,称“运行时类型识别”,这是C+中相对较新的特性,一些老式的编译器可能不支持,不同编译器的实现方法也不尽相同。,17.1 RTTI机制,C+是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。在第11章中讲述了“多态”的概念,虚函数的使用使得动态联编成为可能,举例来说,存在一个类层次结构A-B-C,结构定义为; class A; /包含虚函数 class B: public A; class C: public B; 此时,可以直接用派生类(B类或C类)对象为A类指针赋值,而且,通过该A类指针调用虚成员函数时,调用的版本是为其赋值的派生类对此虚函数的覆盖定义。当然,不可能把所有函数都定义成虚函数,对派生类中定义的普通函数来说,使用A类指针调用该函数是否合法需要具体分析。 先来看如下的强制类型转换机制: A *pa = new B; B *pb = (B *)pa; /直接赋值编译器会报错, 需要强制转换 上述代码是很安全的, 因为pa指向的堆空间中存储的恰好为B类对象,此时使用pb调用B类中定义的非虚函数不会出错。看另一个转换: A *pa = new A; B *pb = (B *)pa; 虽然编译器不会报错,但上述代码明显不安全,存在问题,此时使用pb调用B类中的非虚函数必然会出错。,VC6.0中使用RTTI要进行的设置,在VC6中使用RTTI要进行如下设置,否则运行出错。,17.1.1 dynamic_cast操作符,综合来看,使用派生类对象为基类指针赋值是安全的,可什么时候使用基类指针为派生类指针赋值是安全的呢?C+提供了操作符dynamic_cast,其语法是: CSon *p1 = dynamic_cast(pBase); 其中pBase是基类指针,CSon是派生类型,如果pBase指向的对象是CSon型或CSon的派生类型,指针转换成功,否则,p1为null,即空指针。 见代码17-1,17.1.2 typeinfo类和typeid操作符,在头文件typeinfo中还定义了typeinfo类和typeid操作符,从typeid的字面即可看出,该操作符用以返回类的id,即类型信息,其基本调用格式为: typeinfo /输出结果为B typeinfo类中对=和!=进行了重载,因此可以使用typeid来判断变量是哪种类型。如语句if (typeid(x) = typeid(double)用来判断变量x的类型是否double类型。 见备注代码。,17.1.3 补充说明,RTTI只能应用于包含虚函数的类层次中,只有在虚函数处理上,使用派生类对象给基类指针赋值才有意义。如果类层次中没有虚函数,将派生类赋值给基类指针没有实质意义。RTTI的引入,可检查基类指针向派生类指针的转换是否安全,为类层次中非虚函数和数据成员的调用提供了方法。,17.2 类型转换操作符,包括dynamic_cast,C+中共添加了4个类型转换符,用以对数据类型的转换进行更严格的限制,分别是dynamic_cast、const_cast、static_cast和reinterpret_cast,和前面所讲的类型转换机制相比,新机制让程序员根据需要选择要使用的操作符,明确了转换意图,可读性更强,而且,编译器可方便地对转换是否安全进行检查,能排查很多传统类型转换无法找出的问题,动态操作符dynamic_cast已在上节介绍过,本节对其余3个静态类型转换操作符分别讨论。,17.2.1 const_cast操作符,const_cast的基本使用格式为: const_cast(expr); expr应该为指针和引用的形式,该操作符不会影响expr,除了const和volatile修饰符等,T应与expr类型相同,返回一个新的T型变量,与expr有相同的值。 见代码17-2,17.2.2 static_cast操作符,static_cast的基本语法为:static_cast(expr); 该运算符把expr转换为T型,仅当T类型与expr所属类型能相互隐式转换时,上述转换才合法;否则会报错,能及时发现错误。主要有如下几种用法: 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 把空指针转换成目标类型的空指针。 把任何类型的表达式转换成void类型。 见备注代码,17.2.3 reinterpret_cast操作符,reinterpret_cast的调用格式: reinterpret_cast(expr) reinterpret_cast无法保证转换的安全性,用来将一个类型的指针转变为另一种类型的指针,也用在将整型量转为指针,或将指针转为整型量上。 见代码17-3,17.3 小结,RTTI机制特性能让程序在运行时检测对象的类型,不以指针为转换是否安全的依据,而是考虑指针指向的对象,更本质地说,考虑的是指针指向的内存块的有效性,因而能保证使用指针安全调用虚函数和普通函数。typeid操作符返回一个typeinfo对象的引用,通过t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论