程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第18章 特殊工具與技術(8)

第18章 特殊工具與技術(8)

編輯:C++入門知識

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的專欄
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved