Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Syntaxfehler: Virtuelle Elemente können keine statischen oder nicht statischen Datenelemente sein. Was soll ich tun?

C++-Syntaxfehler: Virtuelle Elemente können keine statischen oder nicht statischen Datenelemente sein. Was soll ich tun?

PHPz
PHPzOriginal
2023-08-22 09:52:44966Durchsuche

Wenn wir in C++ das Schlüsselwort virtual verwenden, um einen Funktionsmember zu definieren, bedeutet dies, dass die Funktion eine virtuelle Funktion ist und von Unterklassen überschrieben werden kann. Wenn wir jedoch ein Datenelement (d. h. ein Attribut) als virtuell definieren, meldet der C++-Compiler einen Fehler: Virtuelle Elemente können keine statischen oder nicht statischen Datenelemente sein.

Warum kann Virtual nicht für Datenelemente verwendet werden? Denn der Unterschied zwischen virtuellen Funktionen und nicht virtuellen Funktionen besteht darin, dass auf virtuelle Funktionen über die Funktionstabelle zugegriffen wird, während auf Datenelemente direkt zugegriffen wird. Wenn wir das Datenelement als virtuell definieren, gibt das Programm einen Fehler aus, da es die virtuelle Funktion nicht finden kann.

Was ist, wenn Sie wirklich eine Mitgliedsvariable in einer Unterklasse überschreiben müssen? Sie können eine neue Funktion verwenden, die in C++11 eingeführt wurde – die virtuelle Vererbung. Die virtuelle Vererbung ist eine spezielle Vererbungsmethode, die die Komplexität der Mehrfachvererbung reduzieren und einige Probleme lösen kann. Bei der virtuellen Vererbung wird der Konstruktor der Basisklasse nur einmal aufgerufen, wodurch die durch mehrfache Initialisierungen verursachten Probleme vermieden werden.

Das Folgende ist ein Beispielcode, der virtuelle Vererbung verwendet, um überschreibende Mitgliedsvariablen zu implementieren:

class Base {
public:
    virtual int& getVar() { return var; }

protected:
    int var;
};

class Derived : virtual public Base {
public:
    virtual int& getVar() { return var; }

protected:
    int var;
};

int main() {
    Base* b = new Derived();
    b->getVar() = 42;
    cout << b->getVar() << endl;

    return 0;
}

In diesem Beispielcode definieren wir eine Basisklasse Base und eine abgeleitete Klasse Derived. In der Basisklasse gibt es eine ganzzahlige Variable. Wir definieren sie als virtuellen Typ. Obwohl auf diese Weise nicht zugegriffen werden kann, kann diese Funktion als Basisklasse zum Umschreiben durch abgeleitete Klassen verwendet werden. Die Derived-Klasse verfügt außerdem über eine Ganzzahlvariable namens var und überschreibt die Funktion getVar() in Base und deckt die Funktion in Base ab. In der Hauptfunktion erstellen wir eine Instanz von Derived, zeigen mit dem Basisklassenzeiger b darauf und greifen über die Funktion getVar() darauf zu. Die Ausgabe beträgt 42.

Mithilfe der virtuellen Vererbung können wir die Mitgliedsvariable namens var in der Basisklasse in der abgeleiteten Klasse überschreiben und auf den Wert dieser Variablen zugreifen, wodurch eine Operation ähnlich dem Überschreiben einer Funktion erreicht wird.

Zusammenfassend lässt sich sagen, dass das Schlüsselwort virtual in C++ nur für Funktionen und nicht für Datenelemente verwendet werden kann. Wenn Sie eine Mitgliedsvariable in einer Unterklasse überschreiben möchten, können Sie die virtuelle Vererbung verwenden. Virtuelle Vererbung kann das Problem der Mehrfachinitialisierung vermeiden und auf überschriebene Mitgliedsvariablen in der Basisklasse zugreifen.

Das obige ist der detaillierte Inhalt vonC++-Syntaxfehler: Virtuelle Elemente können keine statischen oder nicht statischen Datenelemente sein. Was soll ich tun?. 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