C++ RTTI

1.RTTI

RTTI的英文全部意思为Run-Time Type Identification,意思为“运行时类型判断”。RTTI的原理为对某一范型或者接口类型,在运行时再判断该类型或者接口的类型,然后运行对应类型的功能函数。

RTTI的类型的运用,在各种语言中广泛运用;对于JAVA来说,RTTI甚至被号称为JAVA的多态机制的基础。

2.C++中的RTTI

在C++中,RTTI的提出是在1993年,由Stroustrup B.提出(Stroustrup B., “Run-Time Type Identification for C++”, Usenix C++ C onference, Portland, 1993. )。但RTTI的由于其他类型判断会造成低效率,造成部分编译器对RTTI支持性不好。VC++原来一直是不支持RTTI的。在华为的编码规范中,强制要求不用RTTI的写法。这造成了即使是资深C_++程序员,也可能不了解RTTI机制。

3.C++中都RTTI实现

在C++中,RTTI机制是通过虚函数表来实现的。在C++中,虚函数表和虚指针同时也是多态机制的基础。从这个意义上来说,RTTI一开始就和多态和虚函数紧密相关。在C++的RTTI中,是一定要有virtual关键字和虚函数的。

与仅仅的所谓多态属性不同的是,RTTI实现,需要三个元素:

1)dynamic_cast:改运算符将使用一个指向基类的指针变成一个指向派生类的指针。

2)typeid:返回一个指出对象的类型的值。

3)type_info:存储来有关特定类型的信息。

4.样例

# include <iostream>

# include <typeinfo>

 

class Person

{

public:

    virtual ~Person()

    {

    }

 

    virtual void speak()

    {

        std::cout<< "Hello, world!"<<std::endl;

    }

};

 

class Employee: public Person

{

public:

    Employee()

    {

    }

 

    virtual ~Employee()

    {

    }

 

    virtual void speak()

    {

        std::cout<<"Hello, work!!!"<<std::endl;

    }

};

 

void rttiTest(Person &person)

{

    if(typeid(person) == typeid(Employee))

    {

        Employee *pTmp = static_cast<Employee*>(&person);

        pTmp->speak();

    }

    else if(typeid(person) == typeid(Person))

    {

        Person *pTmp = static_cast<Person*>(&person);

        pTmp->speak();

    }

    else

    {

        std::cout<< "Error" << std::endl;

    }

}

 

int main(int argc, char **argv)

{

    Person person;

    Employee employee;

    Person *ptr = &employee;

 

    std::cout<< typeid(int).name() << std::endl;

    std::cout<< typeid(person).name() << std::endl;

    rttiTest(person);

    std::cout<< typeid(employee).name() << std::endl;

    rttiTest(employee);

    std::cout<< typeid(ptr).name() << std::endl;

    //rttiTest(ptr);

    std::cout<< typeid(*ptr).name() << std::endl;

    rttiTest(*ptr);

 

    return 0;

}

上一篇:c – 返回一个Type,或者如何保留一个对象指针的类型?


下一篇:c – 如何在Visual Studio 2008中关闭RTTI