当前位置:编程学习 > C/C++ >>

第18章 特殊工具与技术(8)

18.2.3 RTTI的使用

1. 类层次


class Base2{ 
friend bool operator==(const Base2 &lhs, const Base2 &rhs); 
public: 
    //inte易做图ce 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 inte易做图ce members for Derived  
private: 
    bool equal(const Base2&) const; 
}; 
class Base2{
friend bool operator==(const Base2 &lhs, const Base2 &rhs);
public:
 //inte易做图ce 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 inte易做图ce 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的专栏
 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,