C++ 運行時類型識別


運行時類型識別由兩個運算符實現:

typeid運算符,用於返回表達式的類型

dynamic_cast 運算符,用於將基類的指針或引用安全的轉換成派生類的指針或引用

這兩個運算符用於某種類型的指針或引用時,如果該類含有虛函數,運算符將使用指針或者引用的動態類型。


dynamic_cast運算符:

dynamic_cast<type*>(e);  // e是一個有效指針

dynamic_cast<type&>(e);  // e必須是一個左值

dynamic_cast<type&&>(e);  // e不能是左值

  type必須是一個類類型,通常情況下該類應該含有虛函數。e的類型必須是type的共有派生類或type的共有基類或e的類型就是目標type的類型。如果一條dynamic_cast語句的轉換目標類型是指針類型並且失敗了,則結果為0,若是引用類型,失敗則拋出bad_cast異常。對一個空指針執行dynamic_cast結果是所需類型的空指針。


typeid運算符:

typeid(e); e是一個常量對象的引用,該對象的類型是type_info或type_info的共有派生類型

當運算對象不屬於類類型或者是一個不包含任何虛函數的類時,typeid運算符指示的是對象的靜態類型,當運算對象至少定義了一個虛函數類的左值時,typeid的結果直到運行時才會求得。


RTTI為具有繼承關系的類實現相等運算符:

class Base {
friend bool operator==(const Base&, const Base &);
public:
protected:
virtual bool equal(const Base&) const;
};


class  Derived: public Base
{
public:
protected:
bool equal(const Base&) const;
private:


};


bool operator==(const Base &lhs, const Base &rhs)
{
return (typeid(lhs) == typeid(rhs)) && lhs.equal(rhs);

}


bool Derived::equal(const Base &rhs) const
{
auto r = dynamic_cast<Derived&>(rhs);
// 。。。

}


bool Base::equal(const Base &rhs) const
{
    //。。。
}






注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: