Mooing Duck が言ったように、実行時に 2 つのオブジェクトを動的にバインドする必要がある場合は、二重ディスパッチを使用する必要があります。この場合、関連する型がほとんどないという単純な理由で実行できます。
呼び出しを仮想にすることから始めます。
class B;
class C;
class A{
public:
virtual bool operator<(const A & object) const = 0; // I assume you only care about B and C
virtual bool operator<(const B & object) const = 0;
virtual bool operator<(const C & object) const = 0;
};
次に、次のようにします。
class B: public A{
public:
virtual bool operator<(const A & object) const
{
// do a second bind, now that we know 'this' is type B. Negate cause we
// are switching the operands.
return !object.operator<( (const B&)*this);
}
virtual bool operator<(const B & object) const
{
//<do your logic>; // here you can assume both will be type B
}
virtual bool operator<(const C & object) const
{
return true; // B is always < than C right?
}
};
class C: public A{
public:
virtual bool operator<(const A & object) const
{
// do a second bind, now that we know 'this' is type C. Negate cause we
// are switching the operands.
return !object.operator<( (const C&)*this);
}
virtual bool operator<(const B & object) const
{
return false; // C is always > then B right?
}
virtual bool operator<(const C & object) const
{
//<do your logic>; // here you can assume both will be type C
}
};
ここで行うことは、各オブジェクトの動的バインディングを行うことで、実行時に両方の型を認識します。
更新: 無限再帰を防ぐためにコードを少し変更しました。