次の抽象クラスについて考えてみます。
class Abstract {
public:
// ...
virtual bool operator==(const Abstract& rhs) const = 0;
// ...
};
ここで、この抽象クラスから複数の派生クラスを作成していると仮定します。ただし、それぞれが独自のタイプと比較する場合は異なるアルゴリズムを使用し、他の派生クラスと比較する場合は一般的なアルゴリズムを使用します。次の2つのオプションのうち、どちらがより良い、より効率的なオプションでしょうか?
オプションA:
class Derived : public Abstract {
public:
// ...
bool operator==(const Abstract& rhs) const {
// Code for comparing to any of the other derived classes
}
bool operator==(const Derived& rhs) const {
// Code for comparing to myself
}
// ...
};
オプションB:
class Derived : public Abstract {
public:
// ...
bool operator==(const Abstract& rhs) const {
const Derived* tmp = dynamic_cast<const Derived*>(&rhs);
if (tmp) {
// Code for comparing to myself
}
else {
// Code for comparing to any of the other derived class
}
}
};
C ++型キャストは私にとって比較的不思議なトピックであるため、これらのオプションにどのような長所と短所があるのか、私は本当に興味があります。さらに、どちらのソリューションがより「標準的」であり、2番目のソリューションはパフォーマンスに影響を与えますか?
おそらく3番目の解決策はありますか?特に、派生クラスが多数あり、それぞれが異なる派生クラスに対して独自の特別な比較アルゴリズムを必要としている場合はどうでしょうか。