《RTTI和typeid操作符.ppt》由会员分享,可在线阅读,更多相关《RTTI和typeid操作符.ppt(11页珍藏版)》请在三一办公上搜索。
1、第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类指针赋值
2、,而且,通过该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中使用R
3、TTI要进行的设置,在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类和
4、typeid操作符,从typeid的字面即可看出,该操作符用以返回类的id,即类型信息,其基本调用格式为:typeinfo/输出结果为Btypeinfo类中对=和!=进行了重载,因此可以使用typeid来判断变量是哪种类型。如语句if(typeid(x)=typeid(double)用来判断变量x的类型是否double类型。见备注代码。,17.1.3 补充说明,RTTI只能应用于包含虚函数的类层次中,只有在虚函数处理上,使用派生类对象给基类指针赋值才有意义。如果类层次中没有虚函数,将派生类赋值给基类指针没有实质意义。RTTI的引入,可检查基类指针向派生类指针的转换是否安全,为类层次中非虚函数和
5、数据成员的调用提供了方法。,17.2 类型转换操作符,包括dynamic_cast,C+中共添加了4个类型转换符,用以对数据类型的转换进行更严格的限制,分别是dynamic_cast、const_cast、static_cast和reinterpret_cast,和前面所讲的类型转换机制相比,新机制让程序员根据需要选择要使用的操作符,明确了转换意图,可读性更强,而且,编译器可方便地对转换是否安全进行检查,能排查很多传统类型转换无法找出的问题,动态操作符dynamic_cast已在上节介绍过,本节对其余3个静态类型转换操作符分别讨论。,17.2.1 const_cast操作符,const_cas
6、t的基本使用格式为: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所属类型能相互隐式转换时,上述转换才合法;否则会报错,能及时发现错误。主要有如下几种用法:用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;
7、进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。把空指针转换成目标类型的空指针。把任何类型的表达式转换成void类型。见备注代码,17.2.3 reinterpret_cast操作符,reinterpret_cast的调用格式:reinterpret_cast(expr)reinterpret_cast无法保证转换的安全性,用来将一个类型的指针转变为另一种类型的指针,也用在将整型量转为指针,或将指针转为整型量上。见代码17-3,17.3 小结,RTTI机制特性能让程序在运行时检测对象的类型,不以指针为转换是否安全的依据,而是考虑指针指向的对象,更本质地说,考虑的是指针指向的内存块的有效性,因而能保证使用指针安全调用虚函数和普通函数。typeid操作符返回一个typeinfo对象的引用,通过typeinfo类提供的name成员函数可以输出参数所属类名。本章对C+中新增的4个类型转换操作符进行了说明,和传统的类型转换相比,新增的4个cast操作符很好地保证了类型转换的安全性,直观体现了程序员的意图,编译器可很好地进行查错处理。,
链接地址:https://www.31ppt.com/p-6524245.html