Wie erstellt man eine effiziente Methode equals
für abgeleitete Klassen?Wie wird der Gleichheitstest für abgeleitete Klassen durchgeführt?
struct Base {
virtual bool equals(const Base &other) const = 0;
};
Die übliche Antwort ist dynamic_cast
oder typeid
verwenden Art Identität in abgeleiteten Klassen zu überprüfen, und wenn Typ übereinstimmt, dann kann ein Vergleich:
struct Derived: Base {
virtual bool equals(const Base &other) const override {
if (typeid(*this)!=typeid(other)) return false;
return *this==static_cast<Derived &>(other);
}
};
Gibt es eine effizientere Möglichkeit, diese Art zu tun prüfen? Was können wir tun, wenn RTTI deaktiviert ist?
Wenn Sie bereit sind, gegen das Liskov-Substitutionsprinzip zu verstoßen (dies führt zu anderen Kompromissen, die für Sie akzeptabel oder nicht akzeptabel sind), verwenden Sie den doppelten Versand. – Peter
@Peter: meinst du eine Lösung, wo alle abgeleiteten Typen in irgendeiner Form aufgelistet werden müssen? – geza
Nun, ja. Wenn Sie ein Verhalten wünschen, das vom Typ abhängt, ohne den Typ (oder die Typ-ID) zu testen, müssen Sie für jeden wichtigen Typ etwas Bestimmtes tun. – Peter