g++ -fdump-class-hierarchy layout.cpp
erzeugt eine Datei layout.cpp.class
. Der Inhalt von layout.cpp.class
zeigt Folgendes:
Das Entfernen der 'Reinheit' von f
ändert die fünfte Zeile zu:
Jede Klasse hat ihre eigene vtable. Der Eintrag für f
in Base
wird NULL
sein, und der Eintrag in Derived
wird ein Zeiger auf den Code für die implementierte Methode sein.
Der vtable-Eintrag befindet sich in der Basisklasse.
Warum? Weil Sie einen Basis-Zeigertyp haben können, der die Adresse eines abgeleiteten Typobjekts enthält und die Methode trotzdem für die Zeigervariable des Basistyps aufruft.
Pure virtual teilt dem Compiler einfach mit, dass die abgeleiteten Typen ihre eigene Implementierung bereitstellen müssen, und sie können sich nicht auf die Implementierung der Basisklasse verlassen (falls eine solche in der Basisklasse angegeben ist)
In beiden tatsächlich. Die Basisklasse vtable hat einen Slot für die reine virtuelle Funktion, die auf etwas wie pure_virtual_function_called()
stub verweist, das das Programm wahrscheinlich abbrechen würde, während die abgeleitete Klasse vtable einen Zeiger auf die tatsächliche Implementierung haben wird.