关于C 中RTTI的编码实现
2008-02-23 05:25:07来源:互联网 阅读 ()
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 pm->bonus(); } } void company::payroll(employee &re) { try{ //对引用转换失败的话,则会以抛出异常来报告错误 programmer &rm=dynamic_cast 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; }; |
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C 设计模式之Singleton
下一篇: C 运算符重载探讨
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash