Bei der Diskussion einer Frage zu virtuellen Funktionen in Stack Overflow habe ich mich gefragt, ob es eine offizielle Benennung für reine (abstrakte) und nicht reine virtuelle Funktionen gibt.
Ich habe mich zu meiner Information immer auf Wikipedia verlassen, wo es heißt, dass reine und nicht reine virtuelle Funktionen der Oberbegriff sind. Leider enthält der Artikel keine Herkunft oder Referenzen.
Um Jon Skeets Antwort auf meine Antwort zu zitieren: "Rein" und "Unrein" sind die allgemeinen Begriffe, die verwendet werden:
@Steven: Hmm ... möglicherweise, aber ich habe es bisher nur im Kontext von C ++ gesehen. Ich vermute, dass jemand, der darüber spricht, wahrscheinlich einen C ++ - Hintergrund hat :)
Entstanden die Begriffe aus C ++ oder wurden sie zuerst in einer früheren Sprache definiert oder implementiert, und sind sie die "offiziellen" wissenschaftlichen Begriffe?
AKTUALISIEREN:
Frank Shearar stellte hilfreich einen Link zur Beschreibung der SIMULA 67 Common Base Language (1970) zur Verfügung. Diese Sprache scheint die erste Sprache zu sein, die OO-Schlüsselwörter als Klasse , Objekt und auch virtuell als formales Konzept einführt . Es definiert nicht rein / nicht rein oder abstrakt , aber es unterstützt die Konzepte .
Wer hat sie definiert?
quelle
Antworten:
Nygaard und Dahl verwendeten den Begriff erstmals in SIMULA 67 Common Base Language . Schauen Sie sich zum Beispiel Abschnitt 2.1 und Abschnitt 2.2.3 an. (Soweit ich das beurteilen kann, ist es wahrscheinlich die erste Verwendung des Begriffs.)
quelle
Also ... ich habe ein bisschen recherchiert. Was folgt, ist eine kleine Geschichtsstunde für Interessierte. :) Fahren Sie mit der Schlussfolgerung unten fort, wenn Sie nur an der Antwort interessiert sind.
1967 :
SIMULA 67 , die erste objektorientierte Programmiersprache, definiert Schlüsselwörter als Klasse , Objekt , Call by Reference , Call by Value und Virtual .
Das Vererbungssystem von SIMULA wurde ursprünglich unter einem anderen Namen, der Verkettung (und später als Präfix bezeichnet ), bekannt. Dies bezog sich auf die Tatsache, dass der Code von Supertypen kopiert und mit dem Code von Subtypen „verkettet“ wurde. Später entstand eine andere Form des Vererbungssystems, die Delegation , bei der Anrufe unter Bezugnahme auf den richtigen Typ delegiert werden.
Virtuell bezieht sich höchstwahrscheinlich auf den Prozess, der ausgeführt werden muss, um mithilfe einer virtuellen Methodentabelle einen Aufruf an die richtige Implementierung zu senden . Es ist virtuell im Vergleich zu einer festen / konkreten Implementierung.
1971 :
Niklaus Wirth schreibt über ein Konzept, das als schrittweise Verfeinerung definiert ist . Grundsätzlich wird erklärt, wie ein Programm in Teillösungen aufgeteilt wird, die erweitert werden können.
1974 :
Dies ist die früheste Veröffentlichung, die ich gefunden habe und die den Begriff abstrakte Datentypen von Barbara Liskov prägt .
In diesem Dokument wird auch ein Operationscluster definiert, der das zu spezifizieren scheint, was wir jetzt als Schnittstelle kennen .
Interessante wissenschaftliche Terminologie (Arbeit von 1996):
Vererbung : Ein Mechanismus auf niedrigerer Ebene, mit dem Objekte oder Klassen Verhalten oder Daten gemeinsam nutzen können.
Subtyping : drückt konzeptionelle Spezialisierung aus. Eine bestimmte Form der Vererbung, auch Schnittstellenvererbung genannt .
Abstraktionsprinzipien : Der Prozess der Organisation unseres Wissens über einen Anwendungsbereich in hierarchische Rangfolgen von Ordnungen von Abstraktionen, um ein besseres Verständnis der betreffenden Phänomene zu erhalten.
Teilweise implementierte Abstraktionen : Abstraktionen, deren Definitionen absichtlich unvollständig sind.
Abstrakte Klassen : Spezifischer Begriff für eine teilweise implementierte Klasse in objektorientierten Systemen.
Unbeschränkte Vererbung : Ermöglicht das Neudefinieren (oder sogar Entfernen) von Operationen in Unterklassen.
Strikte Vererbung : Verhaltenskompatible Vererbung.
Fazit :
Abstrakte Klasse ist der allgemeinste Begriff, der in objektorientierten Systemen verwendet wird. Es scheint, dass reine und nicht reine virtuelle Funktionen nur aus C ++ stammen. Zum Beispiel lässt dieses Interview mit Stroustrup den Anschein erwecken , als hätte er die Begriffe erfunden. Wissenschaftliche Arbeiten verwenden eine allgemeinere Terminologie.
Virtual stammt von SIMULA, weshalb es häufig verwendet wird, ist aber kein allgemeiner Begriff. Es definiert bereits Implementierungsdetails. In Bezug auf Vererbungsarten zu sprechen ist angemessener. Nicht-virtuellen standardmäßig entspricht strengen Vererbung standardmäßig, während virtuelle standardmäßig entspricht nicht strikte Vererbung .
Möchtest du den Wikipedia-Eintrag anpassen ? :)
quelle
In C ++ werden Memberfunktionen, die dynamisch gebunden sind und daher von einer Unterklasse überschrieben werden können, als "virtuell" bezeichnet. Virtuelle Funktionen, die unbedingt überschrieben werden müssen, heißen "pure virtual". Beachten Sie, dass eine reine virtuelle Funktion einen Body haben kann, oft jedoch nicht. Eine Klasse mit mindestens einer rein virtuellen Funktion heißt "abstrakt" und kann nicht instanziiert, sondern nur abgeleitet werden.
Ich vermute, der Grund, warum virtuelle Funktionen als virtuell bezeichnet werden, ist die Tatsache, dass nicht bekannt ist, welche tatsächliche Funktion zur Kompilierungszeit aufgerufen wird. In gewisser Weise existiert ein virtueller Funktionsaufruf "nicht" zur Kompilierungszeit.
Ich vermute auch, dass der Begriff "abstrakt" für eine Klasse mit einer rein virtuellen Funktion verwendet wird, weil Sie keine Objekte dieser Klasse haben können. In gewisser Weise ist es ein abstrakter Begriff, der weit von der konkreten Welt der Gegenstände entfernt ist.
Bearbeiten: Andere Sprachen.
Soweit die Frage, wie allgemein der Begriff "virtuell" ist, hier meine zwei Cent. In Smalltalk verwenden alle Funktionen die dynamische Bindung, sodass sie alle virtuell sind und kein spezieller Begriff oder ein Sprachschlüsselwort erforderlich ist. Wenn ich mich in Java nicht irre, entscheidet der Compiler automatisch, ob die dynamische Bindung verwendet werden soll. Für den Programmierer gibt es keine Unterscheidung und daher kein "virtuelles" Schlüsselwort.
In C ++ ist die Unterscheidung zwischen virtuell und nicht virtuell erforderlich, da der Programmierer entscheiden muss, wann die dynamische Bindung verwendet werden soll, um den Overhead zu sparen, wenn er nicht benötigt wird.
quelle
dynamic
-, bei dem es sich um eine Art virtuelle Methode handelt, bei der Speicherplatz gegen Zeit eingetauscht wird: Sie benötigen weniger Speicherplatz und sind langsamer auszuführen alsvirtual
Methoden.