Virtuelle Freunde Funktionen für eine Basisklasse?

8

Ich bin dabei, die Sprache zu lernen, und das ist ein Noob-Zweifel.

Ist es möglich, eine virtuelle Freund-Funktion zu verwenden? Ich weiß nicht, ob es möglich ist, ich habe es nicht einmal getestet, aber es könnte in manchen Situationen nützlich sein. Zum Beispiel für den überladenen Operator & lt; & lt; ().

%Vor%

Meine Vermutung ist, dass es möglich ist, aber ich bin nicht sicher, da eine Freund-Funktion nicht im Klassen-Design implementiert ist und theoretisch nicht Teil davon ist (obwohl in diesem Beispiel konzeptionell es Sinn macht, dass & lt; & lt; ) sollte eine Methode sein, aber aufgrund von Syntaxeinschränkungen ist es nicht möglich, sie als eine zu implementieren.)

BEARBEITEN: Mein Anliegen bezieht sich auf dieses Beispiel:

%Vor%

In diesem Array von gemischten Objekten möchte ich den richtigen Operator & lt; & lt; () für jedes Objekt aufrufen.

    
Kurospidey 27.08.2012, 13:25
quelle

5 Antworten

27

Nein, friend virtual funktioniert überhaupt nicht sinnvoll.

friend Funktionen sind solche, die keine Methoden sind (zB Mitgliederfunktionen) und haben das Recht auf private / protected Mitglieder eines class zuzugreifen.

virtual Funktionen können nur Elementfunktionen sein. Sie können nicht virtual non-member Funktion haben.

Sie können festlegen, dass operator<< eine Referenz auf eine Basisklasse nimmt und dann eine% virtual -Memberfunktion aufruft. Auf diese Weise können Sie das operator<< "fast virtuell" machen:)

Zum Beispiel

%Vor%

druckt derived .

    
Kiril Kirov 27.08.2012, 13:28
quelle
8

Virtual Friend Function Idiom

  

Friend-Funktionen in C ++ können nicht als virtuell deklariert werden und daher ist keine dynamische Bindung von Friend-Funktionen möglich. Das Anwenden einer Friend-Funktion auf eine gesamte Hierarchie von Klassen wird umständlich, wenn eine überladene Friend-Funktion für jede Klasse in der Hierarchie benötigt wird. Diese fehlende Unterstützung für die dynamische Bindung macht es schwer zu rechtfertigen, dass es sich tatsächlich um eine Erweiterung der Klassenschnittstelle handelt. Die Funktionssprache des virtuellen Freundes adressiert dieses Anliegen elegant.

Sie müssen das virtuelle Friend-Funktionsidiom verwenden. Was es in Gist sagt, ist eine virtuelle Funktion in Base zu behalten und die Friend-Funktion diese Funktion aufrufen zu lassen. welche die Funktion der abgeleiteten Klasse polymorph nennen wird

Kopieren Sie das Beispiel direkt über den Link

%Vor%     
Neel Basu 27.08.2012 13:30
quelle
6

Sie können dies ohne Friend-Funktionen lösen, indem Sie nur öffentliche virtuelle Methoden verwenden:

%Vor%

Wenn es nicht sinnvoll ist, dass die Methode print öffentlich ist, dann kann ostream& operator<< als friend deklariert werden.

    
juanchopanza 27.08.2012 13:34
quelle
1

Virtuelle Funktionen sind etwas anderes als Freunde Funktionen. Virtuelle Funktionen werden nur bei Verwendung der Vererbung im Programm verwendet, wobei eine Klasse als Basisklasse und andere als abgeleitete Klassen verwendet werden. Virtuelle Funktionen werden zum dynamischen Binden von Objekten verwendet. Dies bedeutet, dass Sie ein Objekt der abgeleiteten Klasse in einem Zeiger der Basisklasse speichern können und trotzdem die Methode dieser abgeleiteten Klasse aufrufen können. Das Konzept ist bekannt als Polymorphism .

Friend-Funktionen werden verwendet, um auf die private Schnittstelle einer Klasse zuzugreifen. Sie könnten auch verwendet werden, wenn in Ihrer Klasse keine Vererbung verwendet wurde.

    
Coding Mash 27.08.2012 13:29
quelle
1

Sie können nicht gleichzeitig ein Freund und eine virtuelle Funktion derselben Klasse sein. Ein Friend-Operator konnte jedoch eine virtuelle Funktion von dem Objekt aufrufen, das gerade gedruckt wird.

%Vor%     
Bo Persson 27.08.2012 13:32
quelle

Tags und Links