- 1)dynamic_cast()将基类指针安全的转化为派生类指针
- 2)typeid运算符,返回指针,引用所指对象的实际类型
如果想要让这两个RTTI运算符正常工作
,那么基类中至少要有一个虚函数
否则结果就可能跟预测结果不一样
,因为只有虚函数存在
,系统内部才会产生虚函数表
,对象中多一个虚函数指针
,会指向基类中的虚函数表
,虚函数表中会有说明该类的详细信息
dynamic_cast:当用父类 指针 = new 子类时,不能访问子类的普通成员函数
dynamic_cast直接转化成子类指针,如果不能转换,返回nullptr
#ifndef __MAN__
#define __MAN__
#include"Human.h"
#include<iostream>
class Man :public Huamn
{
public:
Man();
virtual void eat() override;
void speak()
{
std::cout << "hello " << std::endl;
}
};
#endif // !__HUMAN__
Huamn* p = new Man;
Man* p2 = dynamic_cast<Man*>(p);
if (p2 != nullptr)
{
p2->speak();
}
else
{
cout << "no man" << endl;
}
Huamn& q = *p;
try
{
Man& q2 = dynamic_cast<Man&>(q);
q2.speak();
}
catch (std::bad_cast)
{
cout << "no man" << endl;
}
typeid([指针|引用]).name()
拿到对象信息,typeid返回一个常量对象的引用,这个常量对象引用是一个标准库类型 type_info
Huamn* p3 = new Man;
Huamn& q3 = *p3;
cout << typeid(*p3).name() << endl;//指向的是什么类型
cout << typeid(p3).name() << endl;//自己是什么类型
cout << typeid(q3).name() << endl;
cout << typeid(123).name() << endl;
cout << typeid('a').name() << endl;
切记,只有基类有虚函数的时候,编译器才会对typeid中的表达式进行求值,否则typeid返回的就是声明时的静态类型
type_info类
- a).name()
Huamn* p4 = new Man;
const type_info& tinf = typeid(*p4);
cout << tinf.name() << endl;