次のコードのように、基本クラスといくつかの派生クラスがあります。
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_;
}
2 つの派生クラスを比較できるようにするには、operator== が必要です。問題は、オブジェクト指向の方法でこれをどのように達成するかです (たとえば、カプセル化、保守性、および拡張性を考慮して)。それを行うための推奨パターンはありますか?dynamic_cast を回避する上記のアプローチに代わるものはありますか?