Details zur Implementierung des virtuellen Versands

Zunächst möchte ich klar machen, dassch verstehe, dass es im C ++ - Standard keine Vorstellung von vtables und vptrs gib. Ich denke jedoch, dass praktisch alle Implementierungen den virtuellen Versandmechanismus auf die gleiche Weise implementieren (korrigieren Sie mich, wenn ich falsch liege, aber dies ist nicht die Hauptfrage). Auch ich glaubeIch weiß, wie virtuelle Funktionen funktionieren, das heißt, ich kann immer sagen, welche Funktion aufgerufen wird, ich brauche nur die Implementierungsdetails.

Angenommen, jemand hat mich Folgendes gefragt:
"Sie haben die Basisklasse B mit den virtuellen Funktionen v1, v2, v3 und der abgeleiteten Klasse D: B, die die Funktionen v1 und v3 überschreibt und eine virtuelle Funktion v4 hinzufügt. Erklären Sie, wie der virtuelle Versand funktioniert."

Ich würde wie folgt antworten:
Für jede Klasse mit virtuellen Funktionen (in diesem Fall B und D) haben wir ein separates Array von Zeigern auf Funktionen mit dem Namen vtable.
Die vtable für B würde @ enthalt

&B::v1
&B::v2
&B::v3

Die vtable für D würde @ enthalt

&D::v1
&B::v2
&D::v3
&D::v4 

Jetzt enthält die Klasse B einen Mitgliedszeiger vptr. D erbt es natürlich und enthält es daher auch. Im Konstruktor und Destruktor von B setzt B vptr so, dass es auf die vtable von B zeigt. Im Konstruktor und Destruktor von D legt D fest, dass es auf Ds vtable verweist.
Jeder Aufruf einer virtuellen Funktion f auf einem Objekt x der polymorphen Klasse X wird als Aufruf von x.vptr [fs Position in vtables] interpretiert.

Die Fragen sind:
1. Habe ich Fehler in der obigen Beschreibung?
2. Woher kennt der Compiler die Position von f in vtable (im Detail, bitte)
3. Bedeutet dies, dass eine Klasse mit zwei Basen zwei vptrs hat? Was passiert in diesem Fall? (Versuchen Sie es in ähnlicher Weise wie ich zu beschreiben, so detailliert wie möglich)
4. Was passiert in einer Diamantenhierarchie mit A oben B, C in der Mitte und D unten? (A ist eine virtuelle Basisklasse von B und C)

Danke im Voraus

Antworten auf die Frage(6)

Ihre Antwort auf die Frage