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.
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
.
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%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.
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.
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%