15RTTI

惡魔布發表於2020-12-20

15RTTI

RTTI(Runtime type information) - 執行時型別識別

通過RTTI,能夠通過基類的指標或引用來檢索其所指物件的實際型別.
RTTI提供了以下兩個非常有用的操作符:

  1. typeid操作符,返回指標和引用所指的實際型別。
  2. 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&);
};