Soweit ich weiß, hat jede Klasse ihre eigene vtable.
Jedoch dieser Wikipedia-Link erwähnt:
Die Versandtabelle eines Objekts wird enthält die Adressen der Objekte dynamisch gebundene Methoden. Methode Anrufe werden durch Abrufen der Adresse der Methode aus dem Objekt Versandtabelle Die Versandtabelle ist das gleiche für alle Objekte, die zu die gleiche Klasse und ist deshalb normalerweise zwischen ihnen geteilt.
Kann jemand bitte etwas Licht geben?
Danke!
Manchmal ist es einfacher mit einem Beispiel zu verstehen:
%Vor%Bei einem Objekt vom Typ Derived könnte es also so aussehen:
%Vor%Bei der Vtable für den Typ "Derived" sieht das so aus:
%Vor%Beachten Sie, dass "methodC" nicht virtuell ist und nicht in der vtable enthalten ist. Beachten Sie außerdem, dass alle Instanzen der abgeleiteten Klasse einen vtable-Zeiger auf dasselbe gemeinsame vtable-Objekt haben (da sie den gleichen Typ haben).
Obwohl die Implementierungen für C ++ und Java etwas anders sind, sind die Ideen nicht inkompatibel. Der wesentliche Unterschied besteht darin, dass Java-Methoden "virtuell" sind, sofern sie nicht als "endgültig" deklariert werden. In C ++ muss das Schlüsselwort "virtual" explizit für die Funktion in der vtable angegeben werden. Alles, was nicht in der vtable ist, wird mit den Kompilierzeittypen anstelle des Laufzeittyps des Objekts ausgelöst.
Ja, virtuelle Methoden werden vom Compiler und der Laufzeit unterschiedlich behandelt.
Java: Alle Methoden in Java sind standardmäßig virtuell. Das bedeutet, dass jede Methode bei der Vererbung überschrieben werden kann, es sei denn, diese Methode wird als final oder statisch deklariert.
Aus der VM-Spezifikation
Die Java Virtual Machine nicht Mandat jede besondere interne Struktur für Objekte. Das Buchzeichen Dort steht: In einigen von Suns Implementierungen des Java Virtual Maschine, ein Verweis auf eine Klasse Instanz ist ein Zeiger auf ein Handle, das ist selbst ein Paar Zeiger: eins zu a Tabelle mit den Methoden der Objekt und ein Zeiger auf die Klasse Objekt, das den Typ des darstellt Objekt und das andere zum Speicher aus dem Heap für das Objekt zugewiesen Daten.
C ++:
Wenn eine Klassenmemberfunktion als virtuell deklariert wird, erstellt der Compiler eine virtuelle Tabelle im Speicher, die alle Funktionszeiger enthält, die als deklariert sind virtuell in dieser Klasse. Dies ermöglicht einen Laufzeitpolymorphismus (d. H. Das Herausfinden des gewünschten Funktion zur Laufzeit). Virtuelle Funktionstabellen haben zusätzlich einen zusätzlichen Zeiger in der Objekt an die V-Tabelle. Da dieser zusätzliche Zeiger und die Vtable die Größe von Das Objekt, ein Klassen-Designer muss vernünftig sein, Funktionen virtuell deklarieren.
Die Reihenfolge der Ereignisse beim Aufruf einer Methode für den Basisobjekt-Zeiger lautet:
Rufen Sie die Funktion indirekt über den vtable-Zeiger auf.
Jede Klasse mit virtuellen Funktionen (d. h. in Java ist es nur "jede Klasse") hat ihre eigene vtable
. Jedes Objekt hat einen Verweis auf seine Klasse vtable versteckt. Objekte derselben Klasse haben also identische Referenzen.
Wenn Sie eine virtuelle Methode aufrufen, führt der Compiler normalerweise eine Suche durch:
%Vor%wird in etwas übersetzt
%Vor%Manchmal kann der Compiler, wenn er einen bestimmten Objekttyp ableiten kann, einen statischen Aufruf anstelle von virtuell ausgeben. Also, Code
%Vor%kann in
übersetzt werden %Vor%Dies wird normalerweise schneller als ein virtueller Anruf ausgeführt.
Dieses Zitat weist darauf hin, dass jedes Objekt eine Dispatch-Tabelle hat, die unter der Klasse geteilt werden kann, da sie für alle Instanzen derselben Klasse gleich sind. I.E. Jede Klasse hat ihre eigene vtable.
Tags und Links java c++ oop virtual-functions