In der Theorie hat C++ keine binäre Schnittstelle und die Reihenfolge der Methoden in der vtable ist undefiniert. Ändern Sie alles über die Definition einer Klasse und Sie müssen jede Klasse neu kompilieren, die davon abhängt, in jeder DLL usw.Wie werden C++ - vtable-Methoden angeordnet? * In der Praxis *
Aber was ich gerne wissen würde ist, wie die Compiler in der Praxis arbeiten. Ich würde hoffen, dass sie nur die Reihenfolge verwenden, in der die Methoden in der Kopfzeile/Klasse definiert sind, was zusätzliche Methoden sicher machen würde. Aber sie könnten auch einen Hash der verstümmelten Namen verwenden, um sie unabhängig von der Reihenfolge zu machen, aber auch dann komplett nicht aktualisierbar.
Wenn die Leute spezifische Kenntnisse darüber haben, wie bestimmte Versionen spezifischer Compiler in verschiedenen Betriebssystemen usw. funktionieren, wäre dies am hilfreichsten.
Hinzugefügt: Idealerweise würden Linker-Symbole für die Offsets der virtuellen Methoden erstellt, so dass die Offsets niemals in aufrufende Funktionen kompiliert würden. Aber mein Verständnis ist, dass das nie gemacht wird. Richtig?
Ich würde überprüfen müssen, um sicherzustellen, dass ich ziemlich sicher bin, dass sie in der Reihenfolge sind, die Sie ihnen erklären. Wenn Sie eine Unterklasse ableiten und weitere virtuelle Funktionen hinzufügen, kommen sie sicher nach der Basisklasse. – tukra
Nicht nur die Reihenfolge der Methoden in der vtable, sondern auch das Vorhandensein der vtable ist ein Implementierungsdetail. Der Standard spezifiziert nur die virtuellen Funktionen und nicht ihre Implementierung :-) –