Speicherlayout einer Klasse unter multipler oder virtueller Vererbung und der vtable (s)?

8

Ich lese "Innerhalb des C ++ Objektmodells" und versuche zu verstehen, wie multiple und virtuelle Vererbung über die vtables erreicht wird (ich verstehe einzelnen Polymorphismus perfekt - gut).

Ich habe Schwierigkeiten zu verstehen, was genau gemacht wird, wenn eine Methode während der virtuellen Vererbung oder während des Castings lokalisiert werden muss, da eine große Offset-Berechnung durchgeführt werden muss.

Wäre jemand in der Lage zu helfen, zu verstehen, wie die multiplen vtables in einem Beispiel mit mehreren oder virtuellen Vererbungen verwendet werden? Wenn ich das Layout und das Problem verstehen könnte, könnte ich dieses Problem wahrscheinlich besser verstehen.

    
mezamorphic 14.02.2015, 22:58
quelle

1 Antwort

10

C ++ - Implementierungen verwenden im Allgemeinen vtables, um virtuelle Funktionen zu implementieren. Eine V-Tabelle ist eine Tabelle mit Zeigern auf Funktionen. Jedes Objekt einer Klasse mit virtuellen Funktionen hat einen versteckten Zeiger auf die vtable, die die Adressen aller virtuellen Funktionen der Klasse enthält.

Beim Aufruf einer virtuellen Funktion berechnet der Code den Offset des Funktionszeigers in der vtable und ruft die Funktion auf, welche Adresse dort gespeichert ist.

Wenn eine abgeleitete Klasse der Basisklasse eine virtuelle Funktion überlagert, zeigt die virtuelle Tabelle dieser Klasse nur auf die überzeichnete Funktion und nicht auf die ursprüngliche.

Dieser ausgezeichnete Artikel erklärt im Detail, wie es funktioniert, sowohl für einzelne als auch für mehrere Erbe.

    
Christophe 14.02.2015 23:27
quelle