18.2.3 RTTI的使用
1. 類層次
class Base2{
friend bool operator==(const Base2 &lhs, const Base2 &rhs);
public:
//interface members for Base
protected:
virtual bool equal(const Base2&) const;
};
class Derived:public Base2{
friend bool operator==(const Base2 &lhs, const Base2 &rhs);
public:
//other interface members for Derived
private:
bool equal(const Base2&) const;
};
class Base2{
friend bool operator==(const Base2 &lhs, const Base2 &rhs);
public:
//interface members for Base
protected:
virtual bool equal(const Base2&) const;
};
class Derived:public Base2{
friend bool operator==(const Base2 &lhs, const Base2 &rhs);
public:
//other interface members for Derived
private:
bool equal(const Base2&) const;
};
2. 類型敏捷的相等操作符
bool operator==(const Base2 &lhs, const Base2 &rhs)
{
return typeid(lhs)==typeid(rhs)&&lhs.equal(rhs);
}
bool operator==(const Base2 &lhs, const Base2 &rhs)
{
return typeid(lhs)==typeid(rhs)&&lhs.equal(rhs);
}3. 虛函數equal
bool Derived::equal(const Base2 &rhs) const
{
const Derived *dp=dynamic_cast<const Derived*>(&rhs);
if(dp)
{
//do work to compare two Derived objects and return result
}
else
return false;
}
bool Derived::equal(const Base2 &rhs) const
{
const Derived *dp=dynamic_cast<const Derived*>(&rhs);
if(dp)
{
//do work to compare two Derived objects and return result
}
else
return false;
}這個強制轉換應該總是成功——畢竟,只有在測試了兩個操作數類型相同之後,才從相等操作符調用該函數。但是,這個強制轉換是必要的,以便可以訪問右操作數的派生類成員。
4. 基類的equal函數
bool Base2::equal(const Base2 &rhs) const
{
//do what is required to compare to Base objects
}
bool Base2::equal(const Base2 &rhs) const
{
//do what is required to compare to Base objects
}使用形參之前不必強制轉換,*this和形參都是Base對象,所以對形參類型也定義了該對象可用的所有操作。
18.2.4 type_info類
因為打算作基類使用,type_info類也提供公用虛析構函數。如果編譯器想要提供附加的類型信息,應該在type_info的派生類中進行。
默認構造函數和復制構造函數以及賦值操作符都定義為private,所以不能定義或復制type_info類型的對象。程序中創建type_info對象的唯一方法是使用typeid操作符。
name函數為type_info對象所表示的類型的名字返回C風格字符串。給定類型所用的值取決於編譯器,具體來說,無須與程序中使用的類型名字匹配。
cout<<typeid(int).name()<<endl; //int
cout<<typeid(Base2).name()<<endl; //class Base2
cout<<typeid(int).name()<<endl; //int
cout<<typeid(Base2).name()<<endl; //class Base2type_info類隨編譯器而變。一些編譯器提供附加的成員函數,這些函數提供關於程序中所有類型的附加信息。
摘自 xufei96的專欄