Héritage et méthodes virtuelles

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 :

  1. Appeler Free sur l’objet pour libérer la mémoire ;
  2. 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; virtual marque la méthode parente comme virtuelle pour activer le polymorphisme à l’exécution ;
  • La sous-classe redéfinit Cry avec le mot-clé override ;
  • La variable est déclarée TAnimal mais contient une instance TDog, 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 virtual les rend virtuelles ;
  • Il faut obligatoirement utiliser override pour redéfinir une méthode virtuelle héritée, sinon le compilateur affiche un avertissement ;
  • Utilisez reintroduce si 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#

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *