RTTI、dynamic_cast、typeid、虚函数表

RTTI、dynamic_cast、typeid、虚函数表

RTTI(Run Time Type Identification):运行时类型识别 ===> 基类中必须至少要有一个虚函数

Human * phuman = new Men;
Human& q = *phuman;

通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或者引用所指的对象的实际派生类型
RTTI我们可以把这个称呼看成是一种系统给我们的一种能力,或者一种功能,这种功能或者能力是通过2给运算符来体现:

  1. dynamic_cast:将基类的指针或者引用安全地转换为派生类的指针或者引用
//  向下转型
Human* phuman = new Men;
Men* p = (Men*) (phuman);  //  C语言风格的强制类型转换,硬把指针转换成 Men *

Men *pmen = dynamic_cast<Men*>(phuman)  //  C++ 风格
if (pmen  != nullptr){
  cout << "phuman 实际是一个 Men 类型 << endl;
}
// 对于引用,如果 dynamic_cast 转换失败,则系统会抛出一个 std::bad_cast 异常
Human* phuman = new Men;
Human& q = *phuman;
try{
  Men& menbm = dynamic_cast<Men&>(q);
} catch (std::bad_cast){

}
  1. typeid运算符:返回指针或者引用所指对象的实际类型
    typeid(类型【指针 / 引用】),也可以是 typeid(表达式)
    拿到对象类型信息;typeid 就会返回一个 常量对象的引用,这个常量对象 是一个标准库类型:type_info(类 / 类类型)

    比较对象时,看的是 new 出来的是哪个对象或者该指针指向的是哪个对象,和定义该指针时定义的类型没关系

    注意:只有当基类有虚函数时,编译器才会对 typeid() 中的表达式求值,否则如果某个类型不含有虚函数,则 typeid() 返回的是表达式的静态类型

type_info 类

typeid 就会返回一个 常量对象的引用,这个常量对象是一个标准库类型, type_info(类 / 类型)
name() 名字

Human* human = new Men;
const type_info &tp = typeid(*human);
cout << tp.name() << endl;  //  class Men
posted @ 2024-10-27 17:01  爱新觉罗LQ  阅读(1)  评论(0编辑  收藏  举报