【C/C++】【类和对象】RTTI和虚函数表

2021-04-12 18:28

阅读:542

标签:rtu   编译器   ESS   运算   vat   code   dba   静态   ide   

RTTI是什么

Run Time Type Identification:运行时类型识别;通过运行时类型识别,程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。

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

主要是通过两个运算符来实现的:

  1. dynamic_cast:能够将基类指针或者引用安全的转换为派生类的指针或者引用;
  2. typeid:返回指针或者引用所指对象的实际类型;
    注意
    要想让1和2正常工作,那么基类中必须至少有一个虚函数,否则这两个运算符的结果可能跟我们预想的不一样;因为只有虚函数的存在,这两个运算符才会使用指针或者引用所绑定的对象的动态类型(new的类型);

dynamic_cast

指针,如果转换成功,说明这个指针实际上是要转换到的那个类型;会做安全检查;

#include 
using namespace std;
class Human
{
public:
	Human();
	Human(int);
	virtual ~Human();
public:
	int m_Age;
	char m_Name[100];
public:
	virtual void eat() =0;
};
Human::Human()
{
	cout (p_m);
	if (p_men != nullptr)
		cout 

引用,如果用dynamic_cast转换失败,系统会抛出一个std::bad_cast异常;

#include  
using namespace std;
class Human
{
public:
	Human();
	Human(int);
	virtual ~Human();
public:
	int m_Age;
	char m_Name[100];
public:
	virtual void eat() =0;
};

Human::Human()
{
	cout (q);
	}
	catch(std::bad_cast) //转换不成功
	{
		cout 

typeid运算符

typeid(类型[指针/引用]/表达式);//得到对象类型信息

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

#include 
using namespace std;
class Human
{
public:
	Human();
	Human(int);
	virtual ~Human();
public:
	int m_Age;
	char m_Name[100];
public:
	virtual void eat() =0;
};

Human::Human()
{
	cout 

type_info类

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

#include 
using namespace std;
class Human
{
public:
	Human();
	Human(int);
	virtual ~Human();
public:
	int m_Age;
	char m_Name[100];
public:
	virtual void eat() =0;
};

Human::Human()
{
	cout 

RTTI与虚函数表

  • C++中,如果类含有虚函数,编译器会对该类产生一个虚函数表;
  • 虚函数表中有很多项,每一项都是一个指针,每个指针指向的是这个类里的各个虚函数的入口地址;
  • 虚函数表项里,第一个表项很特殊,他指向的不是虚函数的入口地址,指向的实际上是咱们这个类所关联的type_info对象;
int main()
{
	Human* phuman = new Men;
	const type_info& tp = typeid(*phuman);
	//phuman对象里有一个指针,指向这个对象所在的类Men里的虚函数表
	return 0;
}

【C/C++】【类和对象】RTTI和虚函数表

标签:rtu   编译器   ESS   运算   vat   code   dba   静态   ide   

原文地址:https://www.cnblogs.com/Trevo/p/13343848.html


评论


亲,登录后才可以留言!