码迷,mamicode.com
首页 > 编程语言 > 详细

c++ RTTI

时间:2015-07-26 22:39:46      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:rtti   c++   

RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

c++有三个支持RTTI的元素
1)如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符返回0 ——空指针。
dynamic_cast < Type *> (pt);
通常,如果指向对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则上述表达式将指针pt转换为Type类型的指针。
否则,结果为0,即空指针。
2) typeid 运算符返回i一个指出对象的类型的值。
typeid对象使得能够确定两个对象是否是同种类型,它与sizeof有些相像,可以接受两种参数:

类名
结果为对象的表达式
它返回一个对type_info对象的引用。
3)type_info结构存储了有关特定类型的信息。
type_info是一个在头文件typeinfo中定义的一个类,重载了== 和 !=运算符

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <typeinfo>
using std::cout;
class Grand
{   
    private:
      int hold;
    public:
      Grand(int h = 0) : hold(h) {}
      virtual void Speak() const { cout << "I am a grand class!\n";}
      int Value() const { return hold; }
};

class Superb : public Grand
{
    public:
      Superb(int h = 0) : Grand(h) {}
      void Speak() const { cout << "I am a superb class!!\n"; }
      virtual void Say() const
      {
          cout << "I hold the superb value of " << Value() << "!\n"; 
      }
};

class Magnificent : public Superb
{
    private:
      char ch;
    public:
      Magnificent( int h = 0, char c = ‘A‘) : Superb(h), ch(c) {}
      void Speak() const { cout << "I am a magnificent class!!!\n"; }
      void Say() const { cout << "I hold  the character "<< ch <<
                 " and the integer " << Value() << "!\n"; }
};

Grand* GetOne();

int main()
{
    std::srand(std::time(0));
    Grand* pg;
    Superb* ps;
    for (int i = 0; i < 5; i++)
    {
        pg = GetOne();
        pg->Speak();
        if (ps = dynamic_cast<Superb *>(pg))
            ps->Say();
        if (typeid(Magnificent) == typeid(*pg))
            cout<<"Yes, you‘re really magnificent.\n";
    }
    return 0;
}


//随机创建三种类中某种类的对象,并对其进行初始化,然后将
//地址作为Grand* 指针返回。
Grand* GetOne()
{
    Grand* p;
    switch (std::rand() % 3)
    {
        case 0: p = new Grand(std::rand() % 100);
            break;
        case 1: p = new Superb(std::rand() % 100);
            break;
        case 2: p = new Magnificent(std::rand() % 100,‘A‘+std::rand() % 26);            break;
    }
    return p;
}



运行结果:
技术分享

C++的RTTI提供了几个最基本的功能:
1、安全的downcast,当你使用dynamic_cast动态从基类指针转换成子类指针的时候,RTTI能保证安全的转换,如果类型不符则抛出一个bad_cast异常。
2、动态获取一个对象的类名称。你可以使用typeid获得一个type_info对象,这个对象保存了这个类型的最基本信息,比如名称。
3、在继承树上遍历,使用typeid获得的type_info对象提供一个before方法,可以用于查找这个类型的基类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

c++ RTTI

标签:rtti   c++   

原文地址:http://blog.csdn.net/nizhannizhan/article/details/47072409

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!