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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章