Was bedeutet es, wenn es einen Verweis auf eine abstrakte Klasse gibt? Ich habe es im Code gefunden und kann es nicht nachvollziehen.
Ich dachte, dass eine abstrakte Klasse nicht instanziiert werden kann. Wie können Sie eine Referenz geben?
Ein Verweis auf eine abstrakte Klasse ist genau wie ein Zeiger auf eine abstrakte Klasse: Er muss auf ein Objekt einer nicht abstrakten Unterklasse der abstrakten Klasse verweisen. Sie können eine Referenz wie diese verwenden, um virtuelle Methoden für die referenzierte Klasse mit der Syntax .
aufzurufen, ähnlich wie bei einem Zeiger auf eine Schnittstelle in Java.
Eine abstrakte Klasse wurde entwickelt, um abgeleitet zu werden. Das Liskov-Substitutionsprinzip besagt grob, dass alles, was die abstrakten Teile von Typen verwendet, die von einer abstrakten Basis abgeleitet sind, gleich gut funktionieren sollte, wenn die Basis polymorph verwendet wird. Das bedeutet, dass eine Referenz oder ein Zeiger auf die Basis verwendet werden sollte.
bar
ist ein pointer
für eine abstrakte Klasse. Sie kann mit dem Operator *
dereferenziert und als reference
in call_foo
übergeben werden, weil% code_% nach einem Zeiger fragt, während call_foo
verlangt eine Referenz).
Im obigen Beispiel wird der Verweis auf die abstrakte Klasse übergeben, und wenn Abstract*
mit der Schreibweise Abstract&
aufgerufen wird (statt der Schreibweise foo()
), wird .
ausgegeben, weil dies der Fall ist das ->
tut es.
Hoffe, das hilft.
Referenzen in C ++ verhalten sich (fast) wie versteckte Zeiger. Insbesondere das gleiche polymorphe Verhalten, das Sie mit einem Zeiger bekommen können, können Sie mit einer Referenz erreichen. Das heißt, das Folgende ist (fast) äquivalent
%Vor%vorausgesetzt, a war eine Ganzzahl, die irgendwo in den vorherigen Zeilen definiert wurde. Folgende Vorkommen der Referenz j sind vollkommen äquivalent zu Vorkommen von (* i). Der Hauptunterschied besteht darin, dass eine Referenz Ihnen nicht den Schmerz der Speicherverwaltung gibt, während ein Zeiger dies tut (es liegt in Ihrer Verantwortung, mit neuen (s) und gelöschten (s) umzugehen). Außerdem muss ein Zeiger nicht auf etwas zeigen, während eine Referenz nicht existieren kann, wenn sie sich nicht auf etwas bezieht. Abgesehen davon können Sie davon ausgehen, dass sie sich genauso verhalten.
Daher ist es absolut legal, einen Verweis auf ein abstraktes Objekt zu haben. Sie werden es oft in Funktionssignaturen finden, wo das polymorphe Verhalten entweder mit Referenzen oder Zeigern erreicht werden kann. Aber Referenzen geben eine leichtere Syntax, wie der folgende Code zeigt
%Vor% unter der Annahme, dass die Überladungen der Klasse A operator ()
sind.