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;
}