Überladen von Operatoren in der abgeleiteten Klasse

9

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?

    
user963241 15.04.2011, 15:33
quelle

3 Antworten

6

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.

    
Ernest Friedman-Hill 15.04.2011, 15:39
quelle
5

Überladen von Operatoren in abgeleiteten Klassen von IBM.

  

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:

%Vor%

Wenn Sie also nicht alle überladen, werden nur die überladenen Funktionen verwendet.

    
user195488 15.04.2011 15:38
quelle
2

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.

    
Alok Save 15.04.2011 16:18
quelle

Tags und Links