C++基础知识 ,RTTI(run time type identification),dynamic_cast(),typeid

  • 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;
发布了157 篇原创文章 · 获赞 167 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章