关于C 中RTTI的编码实现

2008-02-23 05:25:07来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

摘要:

  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] [3] [4] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 设计模式之Singleton

下一篇: C 运算符重载探讨

热门词条
热门标签