Einzelnen Beitrag anzeigen

Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Kind as Opa innerhalb der Deklerartion

  Alt 9. Sep 2009, 13:52
Ich musste es mir auch erst wieder klar machen, aber es ist wie alle es sagen

StackOverflow ist klar weil:

Wenn du eine Klasse erstellst, werden ja alle Speicherbereich erstellt die so benötigt werden und eben auch die Ein-Sprungpunkte der Methoden der Klasse. Das Ermöglicht ja das LateBinding / SpäteBindung. D.h. erstmal das ja zum Zeitpunkt das Programmschreibens noch nicht klar ist, welche Methoden tatsächlich aufgerufen werden.
Delphi-Quellcode:
var Person: TPerson;
//...
procedure TForm1.Button1Click(Sender: TObject);
begin
  Person.Tuwas;
end;
wird jetzt in Button2click ein Kind erstellt mit
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  Person := TKind.Create;
end;
muss ja irgend etwas dafür sorgen, dass bei Button1Click die richtige Methode aufgerufen wird. Wenn du also den Contructor von TKind aufrufst, wird eine Klasse erstellt die Identisch zu TPerson ist und als Einsprungpunkt für TuWas immer die Methode von TKind.Tuwas hat.

Dieser Mechanismus erzeugt jetzt den Stackoverflow, denn egal welchen Typcast du auf Person außerhalb der Klassen anwendest - es wird immer TKind.Tuwas aufgerufen aufgrund des Einsprungpunktes. Das selbe gilt natürlich für innerhalb der Klassen.

Somit kommt es in dein ursprünglicher Aufruf von (Self as TOpa).Tuwas zum Stackoverflow. Es ergibt sich eine Rekursion unendlicher Tiefe und der Stack läuft über wegen der Rücksprungadressen etc.

Ich hoffe das hilft dir etwas beim Verständnis.

Gruß, Chris

[EDIT] 2x Button1Click [/EDIT]
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat