Überdecken ist etwas ganz anderes als überschrieben!
beim Überdecken gibt es in der neuen Klasse eine Methode, die so heißt. D.H. du brauchst eine Referenz vom Typen deiner neuen Klasse, um diese Methode aufrufen zu können.
Der Sinn von virtuellen Methoden ist aber, dass du mit einer Referenz vom Typen der Klasse, die diese Methode zum ersten Mal deklariert, die speziellen Implementierungen der Nachfahren aufrufen kannst:
Delphi-Quellcode:
type
A = class
public
function Miep : Integer; virtual; abstract;
end;
B = class(A)
public
function Miep : Integer; override; // returns 1
end;
C = class(A)
public
function Miep : Integer; override; final; // returns 2
end;
D = class(C)
public
function Miep : Inteher; // returns 3
end;
Im letzten Beispiel siehst du trotzdem 2, nicht 3. Denn hier gelten nur die Methoden, die bereits in A deklariert sind.
Durch überschreiben können Nachfolger ihren Code an der Stelle ausführen lassen. Überdeckende Methoden sind einfach andere methoden und bekommen einen anderen Slot in der
VMT.
Delphi-Quellcode:
var
a : A;
d : D;
begin
a := B.Create();
WriteLn(a.Miep()); // 1
a := C.Create();
WriteLn(a.Miep()); // 2
a := D.Create();
WriteLn(a.Miep()); // 2!
d := D.Create();
WriteLn(d.Miep()); // 3