Aufruf der virtuellen Funktion von V-Tabelle [geschlossen]

7

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.

    
Kushagra Jaiswal 14.06.2013, 10:29
quelle

4 Antworten

16

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: -)

    
user1764961 14.06.2013, 10:49
quelle
2

Es gibt keine Garantie für den Standard, dass virtuelle Funktionen mit v-table implementiert werden. Nur wenn Sie sicher sind, dass der Compiler v-table verwendet, können Sie den benötigten Offset finden.

    
ForEveR 14.06.2013 10:33
quelle
2

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.

    
Mike Seymour 14.06.2013 10:33
quelle
0
___ qstntxt ___

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.

    
___ answer17106749 ___

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: -)

    
___ qstnhdr ___ Aufruf der virtuellen Funktion von V-Tabelle [geschlossen] ___ answer17106507 ___

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.

    
___ answer17106512 ___

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.

    
___ answer17106540 ​​___

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.

    
___
Andrej Palicka 14.06.2013 10:35
quelle

Tags und Links