Virtuelle Methoden werden mit einer virtuellen Methodentabelle (VMT) implementiert. Es gibt eine VMT für jede Klasse. Die VMT enthält einen Eintrag für jede virtuelle Methode in der Klasse. Und dieser Eintrag ist die Adresse der Methode.
Dies ermöglicht sehr effizientes Anrufen. Sie erhalten einfach die Adresse des VMT, der sich in einem festen Offset von Self
befindet. Dann suchen Sie den Methodenzeiger nach Index auf und rufen die Methode auf.
Dies bedeutet, dass wenn Sie eine Klasse mit vielen virtuellen Methoden haben und Sie eine Unterklasse ableiten, erstellen Sie eine brandneue VMT mit allen virtuellen Methoden. Und wenn Sie viele von ihnen nicht überschrieben haben, dann werden Sie feststellen, dass die VMTs viele Überschneidungen haben.
Dies war in den Tagen von 16 Bit wichtig. Die VMTs könnten sehr viel Platz im ausführbaren Image einnehmen (das ist mit der Code-Größe gemeint) und Sie könnten keinen Platz mehr für die VMTs haben. So wurden dynamische Methoden eingeführt. Das Analog zur VMT ist die dynamische Methodentabelle DMT. Dies wird anders implementiert, um Wiederholungen zu vermeiden, wenn Methoden nicht überschrieben werden. Der Nachteil ist, dass der Aufruf dynamischer Methoden teurer ist.
In modernen Zeiten, seit 32 Bit, und vor allem mit den sehr fett ausführbaren Dateien, die Delphi produziert, sind diese Größenprobleme egal. Daher empfehlen wir, ausschließlich virtuelle Methoden zu verwenden.
Virtuelle Methoden Tabelle Implementierungen sind gut verstanden und es gibt viele Referenzen können gefunden werden, um sie zu verstehen. Das ist weniger für dynamische Methoden, die eher kurios sind. Die besten Quellen für Informationen, die ich gefunden haben, sind von Hallvard Vassbotn Blog:
Die beiden Zitate sagen, was Sie wissen müssen. Unterm Strich ist meiner Meinung nach immer virtuell. –
@DavidHeffernan Beitrag bearbeitet! – EProgrammerNotFound