8

Ich lese "Innerhalb des C++ Object Model" und versuche zu verstehen, wie multiple und virtuelle Vererbung über die Vtables erreicht wird. (Ich verstehe Einzelpolymorphismus perfekt - gut).Speicherlayout einer Klasse unter mehrfacher oder virtueller Vererbung und der vtable (s)?

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 mehreren Vtables in einem multiplen oder virtuellen Vererbungsbeispiel verwendet werden? Wenn ich das Layout und das Problem verstehen könnte, könnte ich dieses Problem wahrscheinlich besser verstehen.

+0

Wenn Sie mehrfache Vererbung sagen, meinen Sie aufeinanderfolgende Dervivationen zu haben (c erbt von b, die von a erbt) oder meinen Sie echte Mehrfachvererbung (c erbt gleichzeitig von a an b)? – Christophe

+0

Vielleicht hilft diese Frage http://stackoverflow.com/q/11603198/1741542 –

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.

enter image description here

Wenn eine abgeleitete Klasse von der Basisklasse overides eine im virtuellen Funktion, die virtuelle Tabelle der Klasse verweist nur auf die Funktion außer Kraft gesetzt anstelle der ursprünglichen.

Diese excellent article explains im Detail, wie es funktioniert, sowohl für einzelne und mehrfache Vererbung.

Verwandte Themen