15RTTI
15RTTI
RTTI(Runtime type information) - 執行時型別識別
通過RTTI,能夠通過基類的指標或引用來檢索其所指物件的實際型別.
RTTI提供了以下兩個非常有用的操作符:
- typeid操作符,返回指標和引用所指的實際型別。
- dynamic_cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指標或引用。
dynamic_cast運算子 - 動態轉換
參考 : dynamic_cast徹底明白了~
作用 : 用於類層次間的上行轉換和下行轉換,還可以用於類之間的交叉轉換。
- 對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標;
- 對引用進行dynamic_cast,失敗丟擲一個異常,成功返回正常cast後的物件引用。
class Base
{
public:
virtual void Fun() = 0; //純虛擬函式
};
class Derived : public Base
{
public:
void Fun()
{}
};
int main()
{
Base* bptr;
Derived d;
bptr = &d;
if(dynamic_cast<Derived*>(bptr)) //對指標進行dynamic_cast,失敗返回null
{
Derived* dptr = dynamic_cast<Derived*>(bptr); //安全的向下轉換
}
}
typeid運算子
用法 : typeid(物件名)
or typeid(類名)
- 返回所指的實際型別
返回值 : type_info類的引用
一般用法 : typeid(className).name() == typeid(ObjectName).name()
判斷是否為某個類的物件
type_info
無法定義 - 賦值運算子和建構函式為私有
classtype_info
{
private:
type_info(consttype_info&);
type_info&operator=(consttype_info&);//type_info類的複製建構函式和賦值運算子是私有的。
public:
virtual~type_info();//解構函式
booloperator==(consttype_info&)const;//在type_info類中過載了==運算子,該運算子可以比較兩個物件的型別是否相等。
booloperator!=(consttype_info&)const;//過載的!=運算子,以比較兩個物件的型別是否不相等
constchar*name()const;//使用得較多的成員函式name,該函式反回物件的型別的名字。前面使用的typeid(a).name()就呼叫了該成員函式
boolbefore(consttype_info&);
};