Heim >Backend-Entwicklung >C++ >C++-Kompilierungsfehler: Virtuelle Basisklassen sind in verschiedenen Symboltabellen in derselben Hierarchie definiert. Wie kann ich sie ändern?
C++-Kompilierungsfehler: Virtuelle Basisklassen sind in verschiedenen Symboltabellen in derselben Hierarchie definiert. Wie kann ich sie ändern?
Beim Programmieren in C++ kann ein solcher Fehler auftreten: Virtuelle Basisklassen werden in verschiedenen Symboltabellen in derselben Hierarchie definiert. Wie kann dieser Fehler behoben werden?
Lassen Sie uns zunächst verstehen, was eine virtuelle Basisklasse ist. In C++ bezieht sich eine virtuelle Basisklasse auf eine geerbte Basisklasse, die in der Vererbungsbeziehung nur einmal und nicht wiederholt geerbt wird. Es wird hauptsächlich zur Lösung von Problemen verwendet, die durch Mehrfachvererbung verursacht werden, z. B. durch Diamantenvererbung usw.
Werfen wir nun einen Blick auf einen Teil des Codes:
class A{ public: A(int a):m_a(a){} int m_a; }; class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: public B,public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
Im obigen Code haben wir 4 Klassen definiert, von denen sowohl Klasse B als auch Klasse C Objekt A durch virtuelle Vererbung erben. Schließlich erbt Klasse D die Klassen B und C. In dieser Vererbungsbeziehung können wir feststellen, dass A nur einmal vererbt wird und es sich um eine virtuelle Vererbung handelt. Dies vermeidet Probleme durch die Diamantenvererbung und stellt außerdem sicher, dass nur ein A-Objekt erstellt wird.
Wenn wir jedoch versuchen, den obigen Code zu kompilieren, kann der folgende Fehler auftreten:
error: 'A' is an ambiguous base of 'D'
Diese Fehlermeldung teilt uns mit, dass in derselben Hierarchie die virtuelle Basisklasse A in verschiedenen Symboltabellen definiert ist.
Um dieses Problem zu lösen, können wir also die folgenden zwei Möglichkeiten wählen:
A::
verwenden, um die Basisklasse in Klasse B bzw. Klasse C anzugeben Der Umfang der Klasse A vermeidet das Problem der Definition der virtuellen Basisklasse A in verschiedenen Symboltabellen. Der geänderte Code lautet wie folgt: class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: public B,public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: virtual public B,virtual public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
Ob Sie den Bereichsinterpreter oder die virtuelle Vererbung verwenden, Sie können das Problem der Definition virtueller Basisklassen in verschiedenen Symboltabellen in derselben Hierarchie vermeiden und so Kompilierungsfehler beheben.
Kurz gesagt, die virtuelle Vererbung wird in der C++-Programmierung sehr häufig verwendet, insbesondere wenn es um Mehrfachvererbung geht, kann sie einige Probleme vermeiden. Gleichzeitig müssen wir jedoch auf einige Probleme achten, die durch die virtuelle Vererbung verursacht werden können. Bei der tatsächlichen Verwendung müssen wir sie flexibel nutzen und die geeignete Vererbungsmethode entsprechend unseren Anforderungen auswählen.
Das obige ist der detaillierte Inhalt vonC++-Kompilierungsfehler: Virtuelle Basisklassen sind in verschiedenen Symboltabellen in derselben Hierarchie definiert. Wie kann ich sie ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!