Im Bereich der objektorientierten Programmierung ist es häufig erwünscht, Objekte verwandter Klassen auf Gleichheit zu vergleichen. Beim Umgang mit Klassenhierarchien kann es jedoch eine Herausforderung sein, den richtigen Ansatz zum Überladen des Gleichheitsoperators zu bestimmen.
Beachten Sie die folgende Klassenhierarchie:
class A { int foo; virtual ~A() = 0; }; A::~A() {} class B : public A { int bar; }; class C : public A { int baz; };
Es gibt mehrere Ansätze zum Überladen des Gleichheitsoperator für eine solche Hierarchie.
Das Überladen von Operator== als freie Funktionen ermöglicht den direkten Vergleich von Objekten ohne Umwandlung. Dieser Ansatz verhindert jedoch, dass die Gleichheitsprüfung der Basisklasse (A) für abgeleitete Klassen (B und C) genutzt wird.
Mit dem Ansatz der virtuellen Elementfunktion können abgeleitete Klassen dies tun überschreibt die Gleichheitsprüfung. Dies erfordert jedoch dynamisches Casting, um den Vergleich von Objekten unterschiedlicher Art zu vermeiden, der sich ausführlich anfühlen kann.
Der bevorzugte Ansatz besteht darin, den Prinzipien zu folgen, die in Scott Meyers „Effective C“ dargelegt sind:
Vermeiden Sie die Deklaration konkreter Basisklassen und machen Sie sie abstrakt, wenn sie keine vollständigen Implementierungen haben.
Stellen Sie in Nicht-Blattklassen geschützt bereit nicht-virtuelle Hilfsfunktionen zur Gleichheitsprüfung (z. B. isEqual()).
Definieren Sie in Blattklassen öffentliche, nicht-virtuelle Gleichheitsoperatorüberladungen, die den Hilfsdienst nutzen Funktionen in der Basisklasse.
bool operator==(const B& lhs, const B& rhs) { return lhs.isEqual(rhs) && lhs.bar == rhs.bar; }
Dieser Ansatz verhindert versehentliche Fallbacks und gewährleistet Typsicherheit beim Vergleich von Objekten verschiedener Typen.
Für hierarchieübergreifende Gleichheitsprüfungen sollten Sie die Verwendung einer rein virtuellen Funktion in Betracht ziehen in der Basisklasse, die in abgeleiteten Klassen überschrieben wird.
bool B::pubIsEqual(const A& rhs) const { const B* b = dynamic_cast<const B*>(&rhs); return b != NULL && *this == *b; }
Durch die Einhaltung dieser Prinzipien ist es möglich, eine robuste und typsichere Überladung von Gleichheitsoperatoren für komplexe Klassenhierarchien zu erreichen.
Das obige ist der detaillierte Inhalt vonWie kann der Gleichheitsoperator in Klassenhierarchien sicher überladen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!