Zitat von
Muetze1:
...
Nicht ganz richtig: Der Zugriff auf nicht statische Klassenmethoden ist bei einer Instanzenvariable von Nil nicht möglich, da der Compiler automatisch Code für den Zugriff auf die
VMT erzeugt um die Adresse der Methode zu ermitteln. Somit wäre die Methodenadresse um dorthin zu springen an der Stelle hinterlegt (Instanz +
VMT Eintragsoffset) z.B. NIL+$08 - was aber dann eine EAccessViolation bei $000008 erzeugt, wenn er die Adresse holen will.
Das geht nur mit statischen Funktionen (das ist der Name in C++, Delphi nennt das Class Procedure/Function).
...
Leider muss ich dich enttäuschen
Du gehst davon aus, dass die methoden vom object-pointer aussgehend addressiert werden (nil+&80), das würde nur sinn machen wenn jedes object sich eine kopie der methoden einer klasse anlegt. Dem ist nicht so! Sondern die methode werden vom klassen-pointer ausgehend addressiert und der objekt-pointer wird als unsichtbarer self-parameter übergeben. Deshalt funktioniert dies auch, da ich nicht auf objekt-felder zugreife:
Delphi-Quellcode:
type
TTest =
class
procedure NoStatic(str:
string);
end;
{ TTest }
procedure TTest.NoStatic(str:
string);
begin
ShowMessage(str);
end;
procedure TForm1.Button1Click(Sender: TObject);
var x:TTest;
begin
x.NoStatic('
No Exception');
end;
zB. unser schöne
free würde sonst auch keinen sinn machen
mâxîmôv.
{KDT}