Héritage, méthodes virtuelles, override, reintroduce
Exemple d’héritage de classe
Object Pascal prend en charge l’héritage et les méthodes virtuelles. Dans l’exemple ci-dessous, TDog hérite de TAnimal :
TDog est la sous-classe (classe dérivée), TAnimal est la classe parente (classe de base)
program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;
type
// Classe parente des animaux
TAnimal = class
procedure Cry; virtual; // Méthode virtuelle : cri de l'animal
end; // Fin de définition de classe, seul end; nécessaire
// Sous-classe Chien, hérite Animal et redéfinit le cri
TDog = class(TAnimal)
procedure Cry; override;
end;
procedure TAnimal.Cry;
begin
WriteLn('L''animal pousse un cri');
end;
procedure TDog.Cry;
begin
WriteLn('Ouaf ouaf ouaf');
end;
var
Pet: TAnimal;
begin
// Instance de la classe parente
Pet := TAnimal.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
// Instance sous-classe stockée dans variable parente, polymorphisme actif
Pet := TDog.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
end.Langage du code : JavaScript (javascript)
Résultat d’exécution
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
L'animal pousse un cri
Ouaf ouaf ouaf
FreeAndNil
Libérer un objet en toute sécurité, regroupe deux opérations en une :
- Appeler
Freesur l’objet pour libérer la mémoire ; - Affecter
nilà la variable pour éviter les pointeurs pendants.

Le code ci-dessus stocke un objet de la sous-classe TDog dans une variable de type TAnimal nommée Pet. Lors de l’appel de Cry via Pet, c’est l’implémentation Cry de TDog qui s’exécute, pas celle de TAnimal : c’est le polymorphisme.
Cry; virtualmarque la méthode parente comme virtuelle pour activer le polymorphisme à l’exécution ;- La sous-classe redéfinit
Cryavec le mot-cléoverride; - La variable est déclarée
TAnimalmais contient une instanceTDog, la méthode du chien s’exécute automatiquement.
Pour les méthodes marquées virtual : le compilateur résout l’implémentation correspondante au moment de l’exécution selon le type réel de l’objet.
Si vous supprimez virtual et override
Les deux appels exécuteront la méthode de la classe parente

Capture d’écran après suppression de virtual et override

Tous les affichages proviennent de l’implémentation TAnimal
Le compilateur ne tient compte que du type déclaré de la variable TMyClass, il ignore le type réel de l’objet à l’exécution.
- Les méthodes classiques ne sont pas virtuelles par défaut, seul le marqueur
virtualles rend virtuelles ; - Il faut obligatoirement utiliser
overridepour redéfinir une méthode virtuelle héritée, sinon le compilateur affiche un avertissement ; - Utilisez
reintroducesi vous voulez masquer une méthode virtuelle homonyme de la classe parente sans la redéfinir (non recommandé, source de confusion), équivalent au mot-clé new de C#