【发布时间】:2012-10-14 06:25:43
【问题描述】:
可能重复:
What’s the right way to overload operator== for a class hierarchy?
我有一个基类和几个派生类,如下代码所示:
class Base
{
public:
friend bool operator==(const Base&, const Base&);
virtual ~Base(){}
private:
virtual bool equals(const Base& other) const = 0;
};
bool operator==(const Base& lhs, const Base& rhs)
{
return lhs.equals(rhs);
}
class A : public Base
{
public:
A(int x) : x_(x){}
private:
virtual bool equals(const Base& other) const;
int x_;
};
bool A::equals(const Base& other) const
{
const A* pA = dynamic_cast<const A*>(&other);
if(!pA) return false;
return x_ == pA->x_;
}
class B : public Base
{
public:
B(double y) : y_(y){}
private:
virtual bool equals(const Base& other) const;
double y_;
};
bool B::equals(const Base& other) const
{
const B* pB = dynamic_cast<const B*>(&other);
if(!pB) return false;
return y_ == pB->y_;
}
为了能够比较两个派生类,我想要 operator==。问题是如何以面向对象的方式实现这一点(例如,尊重封装、可维护性和可扩展性)。是否有一些推荐的模式来做到这一点?是否有替代上述方法避免 dynamic_cast 的替代方法?
【问题讨论】:
-
我假设您希望
operator==()在传递A类型的一个对象和B类型的一个对象时返回false,因为这些类没有直接关系。但是假设您从A派生一个类AA:当使用一个A对象和一个AA对象调用时,您希望operator==()做什么? -
@j_random_hacker 如果两个类具有相同的 typeid 并且所有成员变量具有相同的值,则它们应该比较相等。
-
那么 PiotrNycz 的答案就是你想要的,同时引入了最少的维护麻烦。
-
@jogojapan 你能告诉我使用多重调度的
operator==()的实现是什么样子的吗
标签: c++