Muss ich alle überladenen Operatoren mit abgeleitetem Typ neu definieren, wenn ich sie in der abgeleiteten Klasse verwenden muss?
Der folgende Code wird korrekt kompiliert:
%Vor%Aber nach dem, was ich gelesen habe,
C ++ Primer 4. Ausgabe Abschnitt 15.5.3.
Wenn eine abgeleitete Klasse alles machen will die überladenen Versionen verfügbar durch seinen Typ, dann muss es entweder Definieren Sie alle oder keine von ihnen neu.
Macht der Teil des Zitats " none of them
" hier Sinn?
Was es bedeutet, dass, wenn Point
mehr als ein operator+()
hat und Sie nur einen von ihnen neu definiert haben, dann nur dieser in der abgeleiteten Klasse zugänglich wäre; die anderen Überladungen würden versteckt sein. Wenn Sie in der abgeleiteten Klasse nein operator+()
deklarieren, sind alle übergeordneten Klassen verfügbar. Wenn Sie any in der abgeleiteten Klasse deklarieren, sind keine der übergeordneten Klassen verfügbar.
Sinn machen? Dieser Fall ist in Ordnung: Der Elternteil erklärt einen, und Sie definieren ihn neu. Keine Probleme. Wenn das übergeordnete Element jedoch zwei deklarierte, hat die untergeordnete Klasse, die nur eins deklariert, nur Zugriff auf dieses.
Überladen von Operatoren in abgeleiteten Klassen von IBM.
%Vor%Eine Memberfunktion namens f in einer Klasse A Versteckt alle anderen Mitglieder mit dem Namen f in die Basisklassen von A, unabhängig von Rückgabetypen oder Argumente. Das Folgendes Beispiel zeigt dies:
%Vor%Der Compiler würde das nicht zulassen Funktionsaufruf obj_B.f () weil die Deklaration von void B :: f (int) hat versteckte A :: f ().
Um zu überlasten anstatt zu verbergen, a Funktion einer Basisklasse A in a abgeleitete Klasse B, führen Sie die Name der Funktion in den Geltungsbereich von B mit einer Verwendungsdeklaration. Das folgendes Beispiel ist das gleiche wie das vorheriges Beispiel mit Ausnahme der Verwendung Deklaration mit A :: f:
Wenn Sie also nicht alle überladen, werden nur die überladenen Funktionen verwendet.
In C ++ gibt es keinen bereichsübergreifenden Überladen von abgeleiteten Klassenbereichen. Dies ist keine Ausnahme von dieser allgemeinen Regel.
Es gibt keine Überladungsauflösung zwischen der abgeleiteten Klasse und der Basisklasse. Ein Beispiel:
%Vor%Die Ausgabe ist:
%Vor%Dieselbe Regel gilt auch für Operator-Member-Funktionen, schließlich sind sie auch Member-Funktionen!
Wenn in Ihrem Codebeispiel also Point
mehr als ein operator+()
hatte und Sie in der Derived-Klasse den gleichen Operator neu definiert haben, wird nur auf diesen abgeleiteten Klassenoperator für Objekte der abgeleiteten Klasse zugegriffen, weil diese Version der Funktion hides
die anderen Basisklassenversionen von operator+()
.
Wenn Sie das operator+()
in der abgeleiteten Klasse nicht neu definieren, dann ist keine der Elternklassenversionen von operator+()
ausgeblendet und daher über Objekte der abgeleiteten Klasse zugänglich.
Daher die Aussage:
If a derived class wants to make all the overloaded versions available through its type, then it must either redefine all of them or none of them.
Bitte beachten Sie auch, dass overloading
, overriding
und function hiding
drei Begriffe sind, die manchmal leicht missbraucht sind, aber sie haben alle unterschiedliche Bedeutungen.
Tags und Links c++ operator-overloading