運行時類型識別由兩個運算符實現:
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
{
//。。。
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。