Zitat von
himitsu:
Nein, bei sowas werden die Prozeduren direkt angesprungen.
z.B. bei der
WinAPI (
DLL-Exports) gibt es sowas
- der Spung zur Tabelle ist hartcodiert und dort ist dann die Tabelle, da die Adressen ja veränderlich sind.
virtuelle und dynamische Methoden stehen auch in Tabellen
Also ich habe mal irgendwo gelesen, dass Delphi es beim Late-Bindig genau so macht. Eigentlich geht es doch auch nicht anders.
Delphi-Quellcode:
type
TClassA = class(TObject)
protected
function GetMesage: string; virtual;
public
procedure DoSomething;
end;
TClassB = class(TClassA )
protected
function GetMesage: string; override;
end;
implementation
procedure TClassA.DoSomething;
begin
ShowMessage(GetMessage);
end;
function TClassA.GetMessage: string;
begin
Result := 'Grüße der Basisklasse';
end;
function TClassB.GetMessage: string;
begin
Result := 'Hier spricht ClassB';
end;
var
Something: TClassA;
begin
Something := TClassA.Create;
Something.DoSomething; // TClassA.DoSomething wird aufgerufen
Something.Free;
Something := TClassB.Create;
Something.DoSomething; // WIEDER wird TClassA.DoSomething aufgerufen, aber mit anderem Ergebnis
Something.Free;
end.
Bei beiden Instanzen sollte DoSomething auf die gleiche Adresse zeigen. Trotzdem kommt jeweils ein anderes Ergebnis zurück. Damit das funktioniert,
muss irgendwo eine Tabelle existieren, die die Methodenzeiger enthält. Woher sollte die Klasse sonst wissen, welche Methode aufgerufen werden muss? Wenn eine Methode nicht virtuell ist, ist das natürlich etwas anderes, dann kann der Compiler diesen Schritt wegoptimieren.
Edit: Ach verdammt, hab dein Edit übersehen