Du castest ja nur den Pointer, nicht den Inhalt! Welche Methode aufgerufen wird, bestimmt der Typ zur Laufzeit, nicht der im Quelltext angegebene!
Probiers mal selber aus:
Delphi-Quellcode:
type
TMyObject = class
public
destructor Destroy; override;
end;
destructor TMyObject.Destroy;
begin
ShowMessage('Ich werde ausgeführt');
end;
var
Obj: TObject;
begin
Obj := TMyObject.Create;
Obj.Free;
end;