Angenommen, ich eine Diamant Erbe Situation wie folgt:Warum hat die folgende Klasse eine virtuelle Tabelle?
class A{
public: virtual void foo(){};
};
class B: public virtual A{
public: virtual void foo(){};
};
class C: public virtual A{
public: virtual void foo(){};
};
class D: B, C{};
Die letzte Zeile liefert unter Berufung auf Mehrdeutigkeit einen Übersetzungsfehler. Wie ich es verstehe, ist das Problem, dass der Compiler nicht weiß, welches foo in D's vtbl zu platzieren ist, aber warum würde es sogar ein vtbl für D geben, wenn es keine eigenen virtuellen Funktionen definiert?
Ist "virtual" als Schutzlevel-Spezifizierer sogar gültig für Ihre Klassendeklarationszeilen (z. B. Klasse B: virtuelles A)? – Joe
Es ist kein Schutzspezifizierer. Es bezeichnet eine virtuelle Basisklasse, die eine Art legaler Hack ist, um das Diamantproblem zu umgehen. –
Ah, richtig, danke. – Joe