Grundkurs
2019-06-19, 07:28:57
Moin! Ich habe mich gestern mit der Implementierung von virtuellen Funktionen in C++ beschäftigt und verstehe eine Sache nicht richtig. In jeder Erklärung zum Thema werden folgende Aussagen getroffen:
1. Enthält eine Basisklasse eine virtuelle Funktion wird für diese Basisklasse sowie jeweils jede abgeleitete Klasse ein eigenes vtable erstellt, das die Adressen aller virtuellen Funktionen speichert, wobei immer die Adresse der "tiefsten" virtuellen Funktion gespeichert wird. Implementiert eine abgeleitete Klasse daher eine eigene virtuelle Funktion, wird die Adresse dieser Funktion in ihrem vtable gespeichert, ansonsten zumindest die virtuelle Funktion aus der Basisklasse oder einer anderen von dieser abgeleiteten Klasse.
2. Jedes konkrete Objekt erhält einen vtable-pointer, der auf das richtige vtable zeigt, das zu derselben Klasse gehört wie das erzeugte Objekt: vtable-pointer von Cat-Objekt zeigt auf vtable von Cat-Klasse. Soweit so klar.
Was ich jetzt nicht begreife: wie kann der vtable denn nun die zum Objekt passende virtuelle Methode des Objekts aufrufen? Objekt und Klasse sind ja zwei verschiedene Dinge. Es gibt doch nur
ein "statisches" vtable je Klasse. Woher soll dieses wissen welche Objekt-Methode aufgerufen werden soll? Wird dafür etwa für jedes Objekt eine eigene vtable erstellt die immer denselben Aufbau hat (sprich ein vtable für jede Klasse), aber faktisch wird für jedes Objekt ein separates vtable erzeugt dass alle relevanten Speicherorte der virtuellen Methoden des jeweiligen Objekts speichert? Ich verstehe den Sprung von "statisches" vtable zu konkretes Objekt nicht.
1. Enthält eine Basisklasse eine virtuelle Funktion wird für diese Basisklasse sowie jeweils jede abgeleitete Klasse ein eigenes vtable erstellt, das die Adressen aller virtuellen Funktionen speichert, wobei immer die Adresse der "tiefsten" virtuellen Funktion gespeichert wird. Implementiert eine abgeleitete Klasse daher eine eigene virtuelle Funktion, wird die Adresse dieser Funktion in ihrem vtable gespeichert, ansonsten zumindest die virtuelle Funktion aus der Basisklasse oder einer anderen von dieser abgeleiteten Klasse.
2. Jedes konkrete Objekt erhält einen vtable-pointer, der auf das richtige vtable zeigt, das zu derselben Klasse gehört wie das erzeugte Objekt: vtable-pointer von Cat-Objekt zeigt auf vtable von Cat-Klasse. Soweit so klar.
Was ich jetzt nicht begreife: wie kann der vtable denn nun die zum Objekt passende virtuelle Methode des Objekts aufrufen? Objekt und Klasse sind ja zwei verschiedene Dinge. Es gibt doch nur
ein "statisches" vtable je Klasse. Woher soll dieses wissen welche Objekt-Methode aufgerufen werden soll? Wird dafür etwa für jedes Objekt eine eigene vtable erstellt die immer denselben Aufbau hat (sprich ein vtable für jede Klasse), aber faktisch wird für jedes Objekt ein separates vtable erzeugt dass alle relevanten Speicherorte der virtuellen Methoden des jeweiligen Objekts speichert? Ich verstehe den Sprung von "statisches" vtable zu konkretes Objekt nicht.