Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Syntaxfehler: Die virtuelle Vererbung muss eine Konstruktor-Initialisierungsliste verwenden. Wie gehe ich damit um?

C++-Syntaxfehler: Die virtuelle Vererbung muss eine Konstruktor-Initialisierungsliste verwenden. Wie gehe ich damit um?

WBOY
WBOYOriginal
2023-08-22 11:15:431742Durchsuche

C++-Syntaxfehler: Die virtuelle Vererbung muss eine Konstruktor-Initialisierungsliste verwenden. Wie gehe ich damit um?

In der C++-Programmierung ist die Verwendung der virtuellen Vererbung eine gängige Technik, mit der das Problem der Mehrfachvererbung gelöst werden kann. Wenn wir jedoch die virtuelle Vererbung verwenden, müssen wir auf ein Problem achten: Die virtuelle Vererbung muss eine Konstruktor-Initialisierungsliste verwenden. Wenn die Konstruktorinitialisierungsliste nicht verwendet wird, tritt ein Syntaxfehler auf, der dazu führt, dass das Programm nicht kompiliert werden kann. Wie sollen wir also mit diesem Problem umgehen? Lassen Sie uns als Nächstes darüber sprechen.

  1. Warum muss die virtuelle Vererbung eine Konstruktor-Initialisierungsliste verwenden?

In C++ ist die virtuelle Vererbung eine spezielle Vererbungsmethode, mit der das Mehrdeutigkeitsproblem bei Mehrfachvererbung gelöst werden kann. Wenn eine Klasse gleichzeitig von zwei oder mehr Basisklassen erbt und diese Basisklassen eine gemeinsame übergeordnete Klasse haben, gibt es in der abgeleiteten Klasse mehrere Unterobjekte der Basisklasse, was zu Mehrdeutigkeiten führt. Die Funktion der virtuellen Vererbung besteht darin, sicherzustellen, dass mehrere abgeleitete Klassen, die eine bestimmte Klasse direkt oder indirekt erben, nur ein Unterobjekt dieser Klasse enthalten.

Wenn Sie die virtuelle Vererbung verwenden, müssen Sie das Schlüsselwort virtual verwenden, um die Basisklasse als virtuelle Basisklasse zu definieren. Darüber hinaus ist in einer abgeleiteten Klasse eine Konstruktorinitialisiererliste erforderlich, um die virtuelle Basisklasse zu initialisieren. Dies liegt daran, dass der Konstruktor der am stärksten abgeleiteten Klasse für die Konstruktion der Unterobjekte der virtuellen Basisklasse verantwortlich ist. Wenn der Konstruktor der virtuellen Basisklasse im Konstruktor nicht explizit aufgerufen wird, ruft der Compiler standardmäßig den Standardkonstruktor der virtuellen Basisklasse auf, was zu einem Syntaxfehler führt.

Daher muss die virtuelle Vererbung die Konstruktor-Initialisierungsliste verwenden, andernfalls gibt der Compiler einen Fehler aus. Das Folgende ist ein Beispielprogramm, das die Syntaxfehler demonstriert, die dadurch verursacht werden, dass bei Verwendung der virtuellen Vererbung keine Konstruktor-Initialisierungsliste verwendet wird:

#include <iostream>
using namespace std;

class Base {
public:
    Base(int n) : num(n) {}
protected:
    int num;
};

class Derived : virtual public Base { // 虚继承
public:
    Derived(int n) {
        // 在构造函数中没有使用构造函数初始化列表
        num = n;
    }
};

int main() {
    Derived d(10);
    cout << d.num << endl;
    return 0;
}

Im obigen Programm definieren wir eine virtuelle Basisklasse Base und definieren die abgeleitete Klasse als virtuelle Basisklasse . Im Konstruktor der abgeleiteten Klasse wird die Basisklasse nicht mithilfe der Konstruktor-Initialisierungsliste initialisiert. Dadurch meldet der Compiler einen Fehler mit der Meldung „Fehler: Der Konstruktor für ‚Derived‘ muss die Basisklasse ‚Base‘, die keinen Standardkonstruktor hat, explizit initialisieren“.

  1. Wie gehe ich mit dem Problem um, dass die virtuelle Vererbung eine Konstruktor-Initialisierungsliste verwenden muss?

Um das Problem anzugehen, dass die virtuelle Vererbung eine Konstruktor-Initialisierungsliste verwenden muss, können wir die folgenden Ansätze verfolgen.

(1) Rufen Sie den Konstruktor der virtuellen Basisklasse explizit in der Konstruktor-Initialisierungsliste auf

Dies ist die gebräuchlichste Lösung. Rufen Sie in der Konstruktor-Initialisierungsliste der abgeleiteten Klasse explizit den Konstruktor der virtuellen Basisklasse auf, um sicherzustellen, dass das Unterobjekt der virtuellen Basisklasse korrekt initialisiert wird. Ändern wir den Konstruktor der abgeleiteten Klasse im obigen Beispielprogramm und fügen wir die Konstruktor-Initialisierungsliste hinzu, um das Syntaxfehlerproblem zu lösen:

class Derived : virtual public Base { // 虚继承
public:
    Derived(int n) : Base(n) { // 在构造函数初始化列表中调用Base类的构造函数
        num = n;
    }
};

Auf diese Weise kann das Programm normal kompiliert und übergeben werden.

(2) Fügen Sie der virtuellen Basisklasse einen Standardkonstruktor hinzu

Wenn die virtuelle Basisklasse keinen Standardkonstruktor hat, muss in der abgeleiteten Klasse der Konstruktor der virtuellen Basisklasse explizit in der Konstruktorinitialisierungsliste aufgerufen werden . Manchmal können wir jedoch den Quellcode der virtuellen Basisklasse nicht ändern. In diesem Fall können wir das Problem lösen, indem wir der virtuellen Basisklasse einen Standardkonstruktor hinzufügen. Das Folgende ist ein Beispielprogramm:

class Base {
public:
    Base(int n) : num(n) {}
    Base() {} // 添加默认构造函数
protected:
    int num;
};

class Derived : virtual public Base { // 虚继承
public:
    Derived(int n) { // 在构造函数中不需要调用Base类的构造函数
        num = n;
    }
};

In diesem Beispielprogramm fügen wir der virtuellen Basisklasse Base einen Standardkonstruktor hinzu, sodass im Konstruktor der abgeleiteten Klasse Derived kein expliziter Aufruf des Konstruktors der Base erforderlich ist Klasse .

Kurz gesagt, wenn Sie die virtuelle Vererbung verwenden, müssen Sie darauf achten, die Konstruktor-Initialisierungsliste zum Initialisieren der virtuellen Basisklasse zu verwenden, um Syntaxfehler zu vermeiden. Wenn Sie den Quellcode der virtuellen Basisklasse nicht ändern können, können Sie einen Standardkonstruktor hinzufügen, um das Problem zu lösen.

Das obige ist der detaillierte Inhalt vonC++-Syntaxfehler: Die virtuelle Vererbung muss eine Konstruktor-Initialisierungsliste verwenden. Wie gehe ich damit um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn