Heim >Backend-Entwicklung >C++ >Können geschützte übergeordnete Mitglieder mithilfe der Initialisierungsliste des untergeordneten Elements initialisiert werden?

Können geschützte übergeordnete Mitglieder mithilfe der Initialisierungsliste des untergeordneten Elements initialisiert werden?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 19:15:02730Durchsuche

Can Protected Parent Members be Initialized Using Child's Initialization List?

Geschützte übergeordnete Mitglieder mit der Initialisierungsliste des Kindes initialisieren

Bei der objektorientierten Programmierung müssen Sie möglicherweise geschützte Mitglieder initialisieren, die in einer übergeordneten Klasse deklariert sind vom Konstruktor einer untergeordneten Klasse. Dies ist ein häufiges Szenario, aber es stellt sich die Frage: Kann dies mithilfe der Initialisierungsliste der untergeordneten Klasse erreicht werden?

Betrachten wir das folgende Beispiel:

<code class="cpp">class Parent {
protected:
    std::string something;
};

class Child : public Parent {
private:
    Child() : something("Hello, World!") {}
};</code>

Beim Versuch, diesen Code zu kompilieren, Der Compiler meldet einen Fehler: „Klasse ‚Kind‘ hat kein Feld mit dem Namen ‚etwas‘“. Dieser Fehler weist darauf hin, dass der Compiler das Something-Mitglied innerhalb der Child-Klasse nicht finden kann.

Das Problem liegt hier darin, dass der Zugriff auf die Initialisierungsliste der Child-Klasse (: Something("Hello, World!")) nicht geschützt ist Mitglieder der Elternklasse. Dies liegt daran, dass die Initialisierungsliste private Mitglieder der untergeordneten Klasse selbst initialisiert und geschützte Mitglieder der übergeordneten Klasse nicht über den privaten Abschnitt der untergeordneten Klasse zugänglich sind.

Lösung: Weiterleitungskonstruktor

Um dieses Problem zu lösen, können Sie einen Weiterleitungskonstruktor in der übergeordneten Klasse verwenden, um die Initialisierungswerte an das geschützte Mitglied zu übergeben:

<code class="cpp">class Parent {
protected:
    Parent(const std::string& something) : something(something) {}
    std::string something;
};

class Child : public Parent {
private:
    Child() : Parent("Hello, World!") {}
};</code>

Bei diesem Ansatz ruft der Konstruktor der untergeordneten Klasse die auf Der Konstruktor der übergeordneten Klasse über die Parent("Hello, World!")-Syntax. Diese Initialisierung übergibt den Something-Parameter an den Konstruktor der übergeordneten Klasse, der dann das geschützte Something-Mitglied initialisiert.

Das obige ist der detaillierte Inhalt vonKönnen geschützte übergeordnete Mitglieder mithilfe der Initialisierungsliste des untergeordneten Elements initialisiert werden?. 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