如果您不关心类型 A 与类型 B 或 B 与 C 的比较等,那么您可以简单地为每个类实现一个重载的相等运算符:
class A {
public: int data;
bool operator==(const A& rhs) {
return (data == rhs.data);
}
};
class B : public A {
public: float more_data; bool something_else;
bool operator==(const B& rhs) {
return (A::operator==( data ) &&
more_data == rhs.more_data &&
something_else == rhs.something_else);
}
};
不过这很危险,因为如果你从 B 或 C 派生一个新的 D 类,你就会遇到问题。
否则,您需要使用大量 dynamic_cast<> 来实现一些比较器才能真正做到正确。或者,您可以实现一个函数来为每个对象创建一个哈希码并利用它,例如
class A {
public: int data;
virtual long getHashCode() const {
// compute something here for object type A
}
// virtual here just in case you need to overload it in B or C
virtual bool equals( const A& obj ) const {
return (typeid(*this) == typeid(obj) &&
getHashCode() == obj->getHashCode());
}
};
class B : public A {
public: float more_data; bool something_else;
virtual long getHashCode() const {
// compute something here for object type B
}
};
class C : public A {
public: double more_data;
virtual long getHashCode() const {
// compute something here for object type C
}
};
如果您以某种方式将对象的类型合并到哈希码中(上面未显示),那么您也可以省去上面愚蠢的 typeid() 比较。