Referenz - VIRTUAL
Syntax:
TYPE Typname EXTENDS Elterntyp
DECLARE VIRTUAL {SUB|FUNCTION|PROPERTY|OPERATOR} ...
END TYPE
Typ: Klausel
Kategorie: Klassen
Mit dem Schlüsselwort VIRTUAL werden virtuelle Methoden in Klassen deklariert. Diese können von erbenden Klassen überschrieben werden und erlauben so Polymorphismus. Im Gegensatz zu abstrakten Methoden müssen virtuelle einen implementierten Methodenkörper (body) besitzen, der verwendet wird, wenn die Methode nicht überschrieben wird.
Erbende Klassen können eine virtuelle Methode überschreiben, indem sie eine gleichnamige Methode mit denselben Parametern deklarieren. Die Eigenschaft, dass eine Methode virtuell ist, wird beim Vererben nicht implizit weitergegeben, sodass VIRTUAL angegeben werden muss, falls auch die Kindklasse die Methode als virtuell deklarieren soll.
Damit das Programm zur Laufzeit entscheiden kann, welcher Typ aktuell gebraucht wird, enthält die Klasse intern einen zusätzlichen Eintrag, eine sog. vtable, in der die nötigen Informationen enthalten sind. Damit dieser Eintrag hinzugefügt wird, muss eine Klasse mit virtuellen Methoden von OBJECT erben.
Konstruktoren können nicht virtuell sein, da ein Objekt, in diesem Fall vor allem dessen vtable, initialisiert werden muss. Der Compiler fügt darüber hinaus jedem Konstruktor an dessen Beginn eine Initialisierung der vtable hinzu. Wird nun in so einem Konstruktor eine virtuelle Methode verwendet, wird nur die Basisimplementation genutzt, da zum Zeitpunkt des Aufrufs die Initialisierung der Kindklassen nicht stattgefunden hat. Aus diesem Grund dürfen abstrakte Methoden nicht in einem Konstruktor verwendet werden.
Destruktoren können virtuell sein, da die vtable zum Zeitpunkt des Aufrufs initialisiert ist. Werden allerdings im Destruktor virtuelle Methoden aufgerufen, so darf es sich dabei nicht um Methoden von Kindklassen handeln, da alle Kindklassen bis zu diesem Zeitpunkt bereits zerstört wurden.
VIRTUAL kann für bessere Lesbarkeit des Codes auch beim Methodenkörper angegeben werden. Dies ist allerdings nicht zwingend erforderlich, wichtig ist die Angabe in der Deklaration.
Beachte:
In einer mehrstufigen Vererbungshierarchie kann eine überschriebene Methode auf jeder Ebene als abstrakt, virtuell oder normal deklariert werden. Werden die Varianten gemischt, gilt folgende Reihenfolge von oben nach unten in der Hierarchie: Abstrakt -> Virtuell -> Normal.
Beispiel:
Type Hello Extends Object
Declare Virtual Sub hi
End Type
Type HelloEnglish Extends Hello
Declare Sub hi
End Type
Type HelloFrench Extends Hello
Declare Sub hi
End Type
Type HelloGerman Extends Hello
Declare Sub hi
End Type
Sub Hello.hi
Print "Hi!"
End Sub
Sub HelloEnglish.hi
Print "Hello!"
End Sub
Sub HelloFrench.hi
Print "Salut!"
End Sub
Sub HelloGerman.hi
Print "Hallo!"
End Sub
Randomize
Dim As Hello Ptr h
For i As Integer = 0 To 9
Select Case Int(Rnd*4) + 1
Case 1
h = New HelloEnglish
Case 2
h = New HelloFrench
Case 3
h = New HelloGerman
Case Else
h = New Hello
End Select
h->hi
Delete h
Next
Sleep
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.90.0
Unterschiede unter den FB-Dialektformen: nur in der Dialektform -lang fb verfügbar
Siehe auch:
ABSTRACT, TYPE, EXTENDS, OBJECT, Objektorientierung
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|