源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C++中的RTTI机制详解

  • 时间:2021-10-15 10:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++中的RTTI机制详解
[b]前言[/b] RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使用的比较少而已。而我这里就是对RTTI进行总结,今天我没有用到,并不代表这个东西没用。学无止境,先从typeid函数开始讲起。 [b]typeid函数[/b] typeid的主要作用就是让用户知道当前的变量是什么类型的,比如以下代码:
[url=http://www.1sucai.cn/article/55885.htm]static_cast、dynamic_cast、const_cast和reinterpret_cast总结[/url]》的文章中,也介绍了dynamic_cast的使用,对于dynamic_cast到底是如何实现的,并没有进行说明,而这里就要对于dynamic_cast的内幕一探究竟。首先来看一段代码:
[url=http://www.1sucai.cn/article/55881.htm]COM编程——接口的背后[/url]》这篇博文中总结的那样,当类中存在虚函数时,编译器就会在类的成员变量中添加一个指向虚函数表的vptr指针,每一个class所关联的type_info object也经由virtual table被指出来,通常这个type_info object放在表格的第一个slot。当我们进行dynamic_cast时,编译器会帮我们进行语法检查。如果指针的静态类型和目标类型相同,那么就什么事情都不做;否则,首先对指针进行调整,使得它指向vftable,并将其和调整之后的指针、调整的偏移量、静态类型以及目标类型传递给内部函数。其中最后一个参数指明转换的是指针还是引用。两者唯一的区别是,如果转换失败,前者返回NULL,后者抛出bad_cast异常。对于在typeid函数的使用中所示例的程序,我使用dynamic_cast进行更改,代码如下:
[u]复制代码[/u] 代码如下:
#include <iostream> #include <typeinfo> using namespace std;   class A { public:      virtual void Print() { cout<<"This is class A."<<endl; } };   class B : public A { public:      void Print() { cout<<"This is class B."<<endl; } };   class C : public A { public:      void Print() { cout<<"This is class C."<<endl; } };   void Handle(A *a) {      if (dynamic_cast<B*>(a))      {           cout<<"I am a B truly."<<endl;      }      else if (dynamic_cast<C*>(a))      {           cout<<"I am a C truly."<<endl;      }      else      {           cout<<"I am alone."<<endl;      } }   int main() {      A *pA = new B();      Handle(pA);      delete pA;      pA = new C();      Handle(pA);      return 0; }
这个是使用dynamic_cast进行改写的版本。实际项目中,这种方法会使用的更多点。 [b]总结[/b] 我在这里总结了RTTI的相关知识,希望大家看懂了。这篇博文有点长,希望大家也耐心的看。总结了就会有收获。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部