Dein Problem liegt hier:
Code:
...
Auto := TAuto.Create;
Auto.FHersteller := 'BMW';
Coupe := TCoupe(Auto);
Coupe.FSitze := 4;
AutoListe.Add(Coupe);
...
Du erzeugst ein TAuto und castest dann in eine Unterklasse, speicherst aber immer "nur" ein TAuto. Sollte eigentlich so heißen:
Wenn du keine Ahnung vom Casten hast, bzw. es noch nicht richtig kannst/verstehst, dann verwende keine
harten Casts ala
TCoupe(Auto)
,
sondern die weicheren Casts ala
(Auto as TCoupe)
, den so wäre dir das Problem sofort aufgefallen, weil es im Programm entsprechend geknallt hätte.
PS: Dein Pech war, daß der Zugriff auf das falsch gecastete Objekt nicht auch schon geknallt hatte, denn wenn FSitze erst in TCoupe deklariert wurde, dann gibt es dieses Feld in TAuto nicht, und somit greifst du auf etwas zu, was es nicht gibt, welches nicht unbedingt Gesund ist, für ein Programm.