设为首页 加入收藏

TOP

C++RTTI小总结
2015-07-20 17:13:34 来源: 作者: 【 】 浏览:2
Tags:RTTI 总结

RTTI算是C++的一大特性之一了,但也是一个不太好懂的特性。以前一直没有理解清楚RTTI。通过最近的学习,似乎掌握了一点皮毛,这里做一个小总结。首先是《C++编程思想》上的一个例子,由于缺头文件,我把容器改成了vector。

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        //for srand() and rand() using namespace std; class shape { protected: static int count; public: shape() { count++; } virtual ~shape() { count--; } virtual void draw() const = 0; static int quantity() {return count;} }; int shape::count = 0; class rectangle:public shape { void operator=(rectangle&); protected: static int count; public: rectangle() {count++;} ~rectangle() {count--;} rectangle(const rectangle&) {count++;} void draw() const { cout << "rectangle::draw()"<
       
         shapes; time_t t; srand((unsigned)time(&t)); const int mod = 12; for(int i = 0;i
        
         draw(); if(dynamic_cast
         
          (shapes[u])) Ncircles++; if(dynamic_cast
          
           (shapes[u])) Nellipses++; if(dynamic_cast
           
            (shapes[u])) Nrects++; if(dynamic_cast
            
             (shapes[u])) Nshapes++; } cout << endl <
             
              class B { public: virtual float f() {return 1.0;} }; class D : public B { }; B* p = new D; B& r = *p;
             
            
           
          
         
        
       
      
     
    
   
  
typeid()看到的指针类型是基类而不是派生类,这证明了第一条结论,此时的p是一个B型的指针类型,typeid()不会去管指针实际指向的目标。typeid()它看到的引用类型则是派生类,*p是使用p进行了一次指针运算操作,然后r就绑定到了一个D型的实例,也就是说引用的关注点在对象上。
typeid(p) == typeid(B*)
typeid(p) != typeid(D*)
typeid(r) == typeid(D)
与此相反,指针指向的类型在typeid()看来是派生类而不是基类,而用一个引用的地址时产生的是基类而不是派生类。这是因为*p依然是一次指针运算操作,它指向了一个对象,而对引用取地址得到的是一个指针类型,相当于对类型实例做了一次取地址运算。
typeid(*p) == typeid(D)
typeid(*p) != typeid(B)
typeid(&r) == typeid(B*)
typeid(&r) != typeid(D*)
(3)、RTTI一般用于多态类型;

多态类型指的是基类中没有虚函数的类型。典型的RTTI是通过在 VTABLE中放一个额外的指针来实现的。这个指针指向一个描述该特定类型的 typeinfo结构(每个新类只产生一个typeinfo的实例),所以typeid()表达式的作用实际上很简单。VPTR用来取typeinfo的指针,然后产生一个结果typeinfo结构的一个引用。dynamic_cast()的过程稍微复杂点,但也需要利用VTABLE中的信息来进行类型转换。

我不知道怎么去访问到VTABLE的typeinfo信息,倒是在找到了一个访问VTABLE中函数信息的例子。这个例子告诉我们VTABLE不止在书上,感兴趣的可以运行一下,或者改改,有可能能找到typeinfo哟!

#include 
  
   

using namespace std;

class Base
{
private:
    int a;
public:
    virtual void fun1()
    {
        cout<<"Base::fun1()"<
   
    

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Codeforces 521A DNA Alignment .. 下一篇C++学习:范围for(range for)语..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)