Herencia, métodos virtuales, override, reintroduce
Ejemplo de herencia de clases
Object Pascal admite la herencia y los métodos virtuales. En el siguiente ejemplo, TDog hereda de TAnimal:
TDog es la subclase (clase derivada) y TAnimal es la superclase (clase padre)
program AnimalDemo;
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$codepage utf8}
uses SysUtils;
type
// Superclase de animales
TAnimal = class
procedure Cry; virtual; // Método virtual: sonido del animal
end; // Fin de definición de clase, solo end;
// Subclase Perro, hereda Animal y sobrescribe el sonido
TDog = class(TAnimal)
procedure Cry; override;
end;
procedure TAnimal.Cry;
begin
WriteLn('El animal emite un sonido');
end;
procedure TDog.Cry;
begin
WriteLn('Guau guau guau');
end;
var
Pet: TAnimal;
begin
// Instancia de la superclase
Pet := TAnimal.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
// Instancia de subclase almacenada en variable de superclase, se activa el polimorfismo
Pet := TDog.Create;
try
Pet.Cry;
finally
FreeAndNil(Pet);
end;
end.Lenguaje del código: JavaScript (javascript)
Resultado de ejecución
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
El animal emite un sonido
Guau guau guauLenguaje del código: CSS (css)
FreeAndNil
Liberación segura de objetos, une dos pasos en uno:
- Llamar al método
Freedel objeto para liberar memoria; - Asignar
nila la variable para evitar punteros colgantes.

El código anterior guarda un objeto de la subclase TDog dentro de una variable de tipo TAnimal llamada Pet. Al invocar Cry a través de Pet, se ejecuta el método Cry de TDog y no el de TAnimal, esto es el polimorfismo.
Cry; virtualmarca el método padre como virtual y habilita el polimorfismo en tiempo de ejecución;- La subclase sobrescribe
Crycon el modificadoroverride; - La variable se declara como
TAnimalpero almacena un objeto realTDog, ejecutando automáticamente el ladrido del perro.
Para los métodos marcados con virtual: el compilador busca la implementación correspondiente en tiempo de ejecución según el tipo real del objeto.
Si eliminas virtual y override
Ambas llamadas ejecutarán el método de la clase padre

La imagen superior muestra el resultado tras borrar virtual y override

Toda la salida procede de la implementación de TAnimal
El compilador solo reconoce el tipo declarado de la variable TMyClass e ignora el tipo real del objeto en ejecución.
- Los métodos normales no son virtuales por defecto, solo al agregar
virtualpasan a ser virtuales; - Es obligatorio usar
overrideal sobrescribir un método virtual heredado en la subclase, si no el compilador emitirá una advertencia; - Si quieres ocultar un método virtual homónimo de la clase padre sin sobrescribirlo usa
reintroduce(no recomendado, genera confusión), equivale a la palabra reservada new en C#