これは、A、B、およびCの意図されたセマンティクスとcompare()のセマンティクスに依存します。比較は抽象的な概念であり、必ずしも単一の正しい意味(または、さらに言えば、まったく意味)を持っているとは限りません。この質問に対する正しい答えは1つではありません。
これが、比較が同じクラス階層を持つ2つの完全に異なるものを意味する2つのシナリオです。
class Object
{
virtual int compare(const Object& ) = 0;
float volume;
};
class Animal : Object
{
virtual int compare(const Object& );
float age;
};
class Zebra : Animal
{
int compare(const Object& );
};
2つのゼブラを比較する(少なくとも)2つの方法を検討できます。どちらが古いか、どちらがボリュームが大きいかです。どちらの比較も有効で、簡単に計算できます。違いは、ボリュームを使用してシマウマを他のオブジェクトと比較できることですが、年齢を使用してシマウマを他の動物と比較することしかできません。compare()で年齢比較セマンティクスを実装する場合、セマンティクスは階層のこのレベルで定義されていないため、Objectクラスでcompare()を定義しても意味がありません。セマンティクスは基本クラスのレベルで定義されているため(ボリュームを比較する場合はObject、年齢を比較する場合はAnimal)、これらのシナリオのいずれもキャストを必要としないことに注意してください。
これにより、より重要な問題が発生します。一部のクラスは、単一のキャッチオールcompare()関数に適していないということです。多くの場合、compare_age()やcompare_volume()のように、比較対象を明示的に示す複数の関数を実装する方が理にかなっています。これらの関数の定義は、セマンティクスが関連するようになる継承階層のポイントで発生する可能性があり、子クラスに適応させるのは簡単なはずです(適応する必要がある場合)。compare()またはoperator ==()を使用した単純な比較は、多くの場合、正しいセマンティック実装が明白で明確な単純なクラスでのみ意味があります。
簡単に言えば...「状況によります」。