Wo befindet sich die reine virtuelle Funktion in C ++?

7

Welche virtuelle Tabelle wird reine virtuelle Funktion sein? In der Basisklasse oder abgeleiteten Klasse?

Wie sieht beispielsweise die virtuelle Tabelle in jeder Klasse aus?

%Vor%     
skydoor 31.03.2010, 02:33
quelle

4 Antworten

15

g++ -fdump-class-hierarchy layout.cpp erzeugt eine Datei layout.cpp.class . Der Inhalt von layout.cpp.class zeigt Folgendes:

%Vor%

Das Entfernen der 'Reinheit' von f ändert die fünfte Zeile zu:

%Vor%     
Artem Sokolov 31.03.2010, 02:44
quelle
2

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.

    
Tony the Pony 31.03.2010 02:42
quelle
1

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)

    
Brian R. Bondy 31.03.2010 02:38
quelle
1

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.

    
Nikolai Fetissov 31.03.2010 02:39
quelle

Tags und Links