关于C++中RTTI的编码实现
|
51自学网 http://www.wanshiok.com |
摘要:
RTTI(Run-Time Type Identification)是面向对象程序设计中一种重要的技术。现行的C++标准对RTTI已经有了明确的支持。不过在某些情况下出于特殊的开发需要,我们需要自己编码来实现。本文介绍了一些关于RTTI的基础知识及其原理和实现。
RTTI需求:
和很多其他语言一样,C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,这就产生了运行时类型识别的要求。
C++对RTTI的支持:
C++提供了两个关键字typeid和dynamic_cast和一个type_info类来支持RTTI:
dynamic_cast操作符:它允许在运行时刻进行类型转换,从而使程序能够在一个类层次结构安全地转换类型。dynamic_cast提供了两种转换方式,把基类指针转换成派生类指针,或者把指向基类的左值转换成派生类的引用。见下例讲述:
void company::payroll(employee *pe) { //对指针转换失败,dynamic_cast返回NULL if(programmer *pm=dynamic_cast(pe)){ pm->bonus(); } } void company::payroll(employee &re) { try{ //对引用转换失败的话,则会以抛出异常来报告错误 programmer &rm=dynamic_cast(re); pm->bonus(); } catch(std::bad_cast){
} }
|
这里bonus是programmer的成员函数,基类employee不具备这个特性。所以我们必须使用安全的由基类到派生类类型转换,识别出programmer指针。
typeid操作符:它指出指针或引用指向的对象的实际派生类型。
例如:
employee* pe=new manager; typeid(*pe)==typeid(manager) //true |
typeid可以用于作用于各种类型名,对象和内置基本数据类型的实例、指针或者引用,当作用于指针和引用将返回它实际指向对象的类型信息。typeid的返回是type_info类型。
type_info类:这个类的确切定义是与编译器实现相关的,下面是《C++ Primer》中给出的定义(参考资料[2]中谈到编译器必须提供的最小信息量):
class type_info { private: type_info(const type_info&); type_info& operator=( const type_info& ); public: virtual ~type_info(); int operator==( const type_info& ) const; int operator!=( const type_info& ) const; const char* name() const; };
|
<  
1/2 1 2 下一页 尾页 |
|
|
|