Da die gesamte virtuelle Funktion in C ++ in V-Tabelle gespeichert ist. Die Überlagerung findet im Fall der virtuellen Funktion statt. Ich möchte fragen, ob es irgendeinen Weg gibt, wie wir die virtuelle Funktion direkt aus der Tabelle aufrufen können und zu bestimmt, welche Funktionen die V-Tabelle enthält.
Nun, eigentlich kannst du es. Portabilität ist mir egal, aber in VS können Sie es tun. Unter der Annahme, dass wir 32-Bit-Code mit VS erstellen, sind die ersten 4 Bytes an der Objektadresse die vTable-Adresse. Wenn wir uns die Header-Dateien ansehen, kennen wir die Reihenfolge der Methoden in der vtable.
Beispiel:
%Vor%P.S. Ich werde nicht fragen, warum machst du es, aber hier hast du eine Option: -)
Tragbar, nein. Die Sprache gibt nicht vor, wie der virtuelle Versand implementiert wird, sondern nur wie er sich verhält. Es wird nicht unbedingt mit einer v-Tabelle implementiert, und es gibt keine Möglichkeit, auf eine virtuelle Funktion zuzugreifen, außer sie aufzurufen.
Wenn Sie nur einen bestimmten ABI unterstützen müssen, können Sie die Implementierungsdetails zusammen mit einigen zweifelhaften Zeigermodellen verwenden, um ein Objekt einem Funktionszeiger genau so zuzuordnen, wie es der virtuelle Dispatch-Mechanismus tut. Aber Sie werden aus der definierten Sprache in ein nicht unterstütztes, nicht-portables Gebiet hinaustreten, also würde ich definitiv empfehlen, alles zu überdenken, was Sie versuchen zu tun.
Da die gesamte virtuelle Funktion in C ++ in V-Tabelle gespeichert ist. Die Überlagerung findet im Fall der virtuellen Funktion statt. Ich möchte fragen, ob es irgendeinen Weg gibt, wie wir die virtuelle Funktion direkt aus der Tabelle aufrufen können und zu bestimmt, welche Funktionen die V-Tabelle enthält.
Nun, eigentlich kannst du es. Portabilität ist mir egal, aber in VS können Sie es tun. Unter der Annahme, dass wir 32-Bit-Code mit VS erstellen, sind die ersten 4 Bytes an der Objektadresse die vTable-Adresse. Wenn wir uns die Header-Dateien ansehen, kennen wir die Reihenfolge der Methoden in der vtable.
Beispiel:
%Vor%P.S. Ich werde nicht fragen, warum machst du es, aber hier hast du eine Option: -)
Es gibt keine Garantie für den Standard, dass virtuelle Funktionen mit %code% implementiert werden. Nur wenn Sie sicher sind, dass der Compiler %code% verwendet, können Sie den benötigten Offset finden.
Tragbar, nein. Die Sprache gibt nicht vor, wie der virtuelle Versand implementiert wird, sondern nur wie er sich verhält. Es wird nicht unbedingt mit einer v-Tabelle implementiert, und es gibt keine Möglichkeit, auf eine virtuelle Funktion zuzugreifen, außer sie aufzurufen.
Wenn Sie nur einen bestimmten ABI unterstützen müssen, können Sie die Implementierungsdetails zusammen mit einigen zweifelhaften Zeigermodellen verwenden, um ein Objekt einem Funktionszeiger genau so zuzuordnen, wie es der virtuelle Dispatch-Mechanismus tut. Aber Sie werden aus der definierten Sprache in ein nicht unterstütztes, nicht-portables Gebiet hinaustreten, also würde ich definitiv empfehlen, alles zu überdenken, was Sie versuchen zu tun.
Ich würde im Allgemeinen nein sagen, weil die genaue Implementierung der vtable eine Plattform / Compiler-spezifisch ist. Wenn Sie wissen, wie die Plattform / der Compiler die vtable und die Adresse implementiert, könnte es möglich sein, sie zu berechnen, indem Sie die Adresse einer vtable für eine bestimmte Klasse ermitteln und dann einen Offset einer virtuellen Methode hinzufügen.
Die vtable enthält alle virtuellen Methoden für die Klasse. Sie können die Anwendung zerlegen, um sie zu sehen.
Tags und Links c++ vtable virtual-functions