Implementierung eines virtuellen Operators<<
Die Notwendigkeit eines virtuellen Operators<< entsteht, wenn das Verhalten des Streaming-Operators für verschiedene Klassen angepasst wird. Versuche, den Operator als virtuell zu definieren, führen oft zu dem Fehler „Operator <<: Nur Mitgliedsfunktionen und Basen können virtuell sein.“
Das Dilemma der freien Funktionen
Das Problem entsteht, weil der Operator<< wird typischerweise als freie Funktion definiert, die kein Empfängerobjekt hat und nicht virtuell sein kann. Wenn Sie den Operator hingegen als Mitgliedsfunktion definieren, wird die Reihenfolge der Parameter umgekehrt, was zu einem Kompilierungsfehler führt.
Eine Lösung über Indirektion
Um dieses Dilemma zu lösen, Erwägen Sie das Hinzufügen einer virtuellen Member-Funktion, die das gewünschte Ausgabeverhalten kapselt:
<code class="cpp">class MyClass { public: virtual void print(ostream& out) const; // Virtual output function };</code>
Benutzerdefinierter Operator mit virtuellem Verhalten
Wenn die virtuelle Member-Funktion vorhanden ist, können Sie definieren der Operator<< als freie Funktion, die an die Druckfunktion delegiert:
<code class="cpp">ostream& operator<<(ostream& out, const MyClass& mc) { mc.print(out); // Calls the virtual print function return out; }</code>
Dieser Ansatz behält die korrekte Parameterreihenfolge für den Operator bei<< freie Funktion und ermöglicht gleichzeitig die Anpassung des Ausgabeverhaltens über die virtuelle Memberfunktion. Unterklassen können die Druckfunktion überschreiben, um ihre eigene benutzerdefinierte Ausgabeformatierung zu implementieren.
Das obige ist der detaillierte Inhalt vonWarum kann ich den „Operator' nicht erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!