- 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;