Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - VIRTUAL

Referenz-Navigation

 

Syntax:

TYPE Typname EXTENDS Elterntyp
  DECLARE VIRTUAL {SUB|FUNCTION|PROPERTY|OPERATOR} ...
END TYPE

Typ: Klausel
Kategorie: Klassen

Mit dem Schlüsselwort VIRTUAL werden Externer Link!virtuelle Methoden in Klassen deklariert. Diese können von erbenden Klassen überschrieben werden und erlauben so Externer Link!Polymorphismus. Im Gegensatz zu Befehlsreferenzeintragabstrakten 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 BefehlsreferenzeintragOBJECT erben.

BefehlsreferenzeintragKonstruktoren 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 Befehlsreferenzeintragabstrakte Methoden nicht in einem Konstruktor verwendet werden.

BefehlsreferenzeintragDestruktoren 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 Befehlsreferenzeintrag-lang fb verfügbar

Siehe auch:
BefehlsreferenzeintragABSTRACT, BefehlsreferenzeintragTYPE, BefehlsreferenzeintragEXTENDS, BefehlsreferenzeintragOBJECT, BefehlsreferenzeintragObjektorientierung


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 24.06.2013 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 25.06.2013 von Redakteurnemored gespeichert.
  Versionen Versionen