Vererbung, virtuelle Methoden, override, reintroduce
Beispiel für Klassenvererbung
Object Pascal unterstützt Vererbung und virtuelle Methoden. Im folgenden Beispiel erbt TDog von TAnimal:
TDog ist die Unterklasse (abgeleitete Klasse), TAnimal die Oberklasse (Basisklasse)
program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;
type
// Oberklasse für Tiere
TAnimal = class
procedure Cry; virtual; // Virtuelle Methode: Tierlaut
end; // Ende der Klassendefinition, nur end; nötig
// Unterklasse Hund, erbt Tier und überschreibt Laut
TDog = class(TAnimal)
procedure Cry; override;
end;
procedure TAnimal.Cry;
begin
WriteLn('Das Tier gibt einen Laut von sich');
end;
procedure TDog.Cry;
begin
WriteLn('Wau wau wau');
end;
var
Pet: TAnimal;
begin
// Instanz der Oberklasse
Pet := TAnimal.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
// Unterklasseninstanz in Oberklassenvariable speichern, Polymorphismus aktiv
Pet := TDog.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
end.Code-Sprache: JavaScript (javascript)
Ausgabeergebnis
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
45 lines compiled, 0.1 sec, 68544 bytes code, 4260 bytes data
D:\fpcdemo>mydemo
Das Tier gibt einen Laut von sich
Wau wau wauCode-Sprache: CSS (css)
FreeAndNil
Sicheres Freigeben von Objekten, zwei Schritte kombiniert:
- Aufruf von
Freeam Objekt zum Freigeben des Speichers; - Setzen der Variable auf
nil, um hängende Zeiger zu vermeiden.

Der obige Code speichert ein Objekt der Unterklasse TDog in einer Variable vom Typ TAnimal namens Pet. Ruft man über Pet die Methode Cry auf, wird die Cry-Implementierung aus TDog ausgeführt, nicht die aus TAnimal – das ist Polymorphismus.
Cry; virtualmarkiert die Oberklassenmethode als virtuell und aktiviert Laufzeitpolymorphismus;- Die Unterklasse überschreibt
Crymit dem Schlüsselwortoverride; - Die Variable ist als
TAnimaldeklariert, enthält aber eine echteTDog-Instanz, wodurch automatisch die Hundelaut-Methode läuft.
Bei mit virtual markierten Methoden löst der Compiler zur Laufzeit die passende Methodenimplementierung anhand des echten Typs des Objekts auf.
Entfernt man virtual und override
Beide Aufrufe führen die Methode der Oberklasse aus

Das obige Bild zeigt das Ergebnis nach Entfernen von virtual und override

Alle Ausgaben stammen aus der TAnimal-Implementierung
Der Compiler berücksichtigt nur den deklarierten Variablentyp TMyClass und ignoriert den echten Laufzeittyp des Objekts.
- Normale Methoden sind standardmäßig nicht virtuell, nur das Schlüsselwort
virtualmacht sie virtuell; - Zum Überschreiben einer geerbten virtuellen Methode in der Unterklasse ist
overridezwingend erforderlich, sonst gibt der Compiler eine Warnung aus; - Verwende
reintroduce, wenn du eine gleichnamige virtuelle Methode der Oberklasse verstecken, aber nicht überschreiben möchtest (nicht empfohlen, sorgt für Verwirrung), entspricht dem new-Schlüsselwort in C#