ポリモーフィックな等価性について質問しているため、 のパブリック インターフェイスを介してポリモーフィックに比較することだけが理にかなっていますBaseType
。例えば:
struct BaseType
{
virtual int foo() const { return 42; }
};
struct DerivedType : BaseType
{
virtual int foo() const { return i_; }
explicit DerivedType(int i) : i_(i) {}
private:
int i_;
};
bool operator==(const BaseType& lhs, const BaseType& rhs)
{
return lhs.foo() == rhs.foo();
}
int main()
{
BaseType b;
DerivedType d(13);
std::cout << std::boolalpha;
std::cout << (b == d) << std::endl;
}
これを実装するにはさまざまな方法がありますが、基本的な考え方は、等価演算子がオペランドの仮想パブリック インターフェイスを使用することです。ただし、パブリック インターフェイスは、メンバー関数などを介して多くのロジックを隠すことができます。
bool equals(const BaseType& other) const
{
// Call virtual methods to determine equality.
// These can be public, private or protected.
}
次に、非メンバー オペレーターがこれを呼び出します。
bool operator==(const BaseType& lhs, const BaseType& rhs)
{
return lhs.equals(rhs);
}