立即学习:https://edu.csdn.net/course/play/9186/191704?utm_source=blogtoedu
//一:RTTI是什么 (run time type Identification):运行类型识别
//Human* phuman = new Men;
//Human& q = *phuman; //*phuman 表示指针phuman所指向的对象
RTTI 我们可以把这个称呼看成是一种系统提供给我们的一种能力 或者功能。
(1)dynamic_case运算符: 能够将基类的指针或者 引用安全的转换为派生类的指针或者引用
(2) typeid 运算符: 返回指针或者引用所指对象的实际类型
补充: 基类中必须有一个虚函数 不然两个运算符结果不一样
//phuman->eat();
//二: dynamtic_case运算符 如果该运算符能够转换成功 说明这个指针实际上是要转换到的那个类型
//Human* phuman = new Men;
//Men* p = (Men*)(phuman);
//p->testfunc();
//Human* phuman = new Men;
//Men* pmen = dynamic_cast<Men*>(phuman);
//if (pmen != nullptr)
//{
// cout << "phuman是一个Men类型" << endl;
// pmen->testfunc();
//}
//else
//{
// cout << "phuman不是一个Men类型" << endl;
//
//}
//对于引用,如果用dynamic_case转换失败
//Human* phuman = new Men;
//Human& q = *phuman;
//try
//{
// Men& menbm = dynamic_cast<Men&>(q);
// cout << "phuman实际上是一个Men类型" << endl;
// menbm.testfunc();
//
//}
//catch(std::bad_cast)
//{
// cout << "phuman 实际上不是一个Men类型" << endl;
//
//}
//typeid 运算符
//Human* phuman = new Men;
//Human& q = *phuman;
//cout << typeid(*phuman).name() << endl; //class Men
//cout << typeid(q).name() << endl; //class Men
//char a[10] = { 5,1 };
//int b = 10;
//cout << typeid(a).name() << endl;
//cout << typeid(b).name() << endl;
//cout << typeid(19.6).name()<< endl;
//cout << typeid("asd").name()<< endl;
//typeid 主要是为了比较两个指针是否指向同一类型的对象
//(1);两个指针定义的类型相同(Human)
//Human* phuman = new Men;
//Human* phuman2 = new Women;
//if(typeid(phuman) == typeid(phuman2))
//{
// cout << "phuman和phuman2是同一种类型【看指针定义】" << endl;
//
//}
//(2)
//Human* phuman = new Men;
//Men* phuman2 = new Men;
//Human *phuman3 = phuman2;
//if (typeid(*phuman) == typeid(*phuman2))
//{
// cout << "phuman和phuman2指向的对象类型相同" << endl;
//
//}
//if (typeid(*phuman2) == typeid(*phuman3))
//{
// cout << "phuman2和phuman3指向的对象类型相同" << endl;
//
//}
//Human* phuman = new Men;
//if (typeid(*phuman) == typeid(Men))
//{
// cout << "phuman指向Men" << endl;
//
//}
//if (typeid(*phuman) == typeid(Human))
//{
// cout << "phuman指向Human" << endl;
//
//}
//基类必须有虚函数 否则上边的条件不成立
//四:type_info类
//
//Human* phuman = new Men;
//const type_info& tp = typeid(*phuman);
//cout << tp.name() << endl;
//
b) == ,!=
//Human* phuman2 = new Men;
//const type_info& tp2 = typeid(*phuman2);
//if (tp == tp2)
//{
// cout << "tp和tp2类型相同" << endl;
//}
//Human* phuman3 = new Men;
//const type_info& tp3 = typeid(phuman3);
//if (tp == tp3)
//{
// cout << "tp 和 tp3 类型相同" << endl;
//}
//五: RTTI与虚函数表
//C++中如果类含有虚函数 编译器就会对该类产生一个虚函数表
//虚函数表里有很多项 每一项都是一个指针 每个指针指向的是这个类里的各个虚函数的入口地址
//虚函数表项里 第一个表项很特殊 , 它指向的不是虚函数的入口地址 它指向的实际上是咱们这个类所关联 的typeid