第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++ ,