Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich in einer von einer Vorlage abgeleiteten Klasse nicht auf geschützte Mitglieder meiner Basisklasse zugreifen?

Warum kann ich in einer von einer Vorlage abgeleiteten Klasse nicht auf geschützte Mitglieder meiner Basisklasse zugreifen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 11:38:02146Durchsuche

Why Can't I Access Protected Members of My Base Class in a Template Derived Class?

Vorlagenvererbung und Suche nach nicht abhängigen Namen verstehen

Bedenken Sie den folgenden Codeausschnitt:

<code class="cpp">// arrayListType.h
template <class elemType>
class arrayListType {
protected:
    elemType *list;
    int length;
};

// unorderedArrayListType.h
template <class elemType>
class unorderedArrayListType: public arrayListType<elemType> {
};

// main1.cpp
unorderedArrayListType<int> intList(25);</code>

Kompilieren Sie dies Code führt zu einem Fehler: „Länge wurde in diesem Bereich nicht deklariert“, was darauf hinweist, dass die geschützten Variablen der übergeordneten Klasse, arrayListType, in der geerbten Klasse, unorderedArrayListType, nicht sichtbar sind.

Dies ist auf ein Konzept zurückzuführen Dies wird als Suche nach nicht abhängigen Namen bezeichnet und definiert, wie der Compiler Verweise auf nicht abhängige Namen in Vorlagen auflöst. Nicht abhängige Namen sind solche, die nicht von den Vorlagenparametern abhängen, wie z. B. Mitgliedsvariablen oder Mitgliedsfunktionsnamen.

In diesem Fall sind die geschützten Variablen in arrayListType nicht abhängige Namen, und zwar nicht explizit definiert in der Klassendefinition unorderedArrayListType. Der Compiler kann nicht feststellen, dass diese Namen in der geerbten Klasse vorhanden sind, und meldet daher einen Fehler.

Beheben des Fehlers

Es gibt zwei gängige Ansätze, um diesen Fehler zu beheben:

Verwenden Sie dies-> Präfix:

Nicht abhängigen Namen wird dieses Präfix vorangestellt-> gibt explizit an, dass sie sich auf geerbte Mitglieder beziehen:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    void insertAt(int location, const elemType& insertItem) {
        this->length++;
        this->list[location] = insertItem;
    }
};</code>

Verwendung von Deklarationen:

Die Verwendung von Deklarationen deklariert explizit die nicht abhängigen Namen innerhalb der geerbten Klasse:

<code class="cpp">class unorderedArrayListType: public arrayListType<elemType> {
public:
    using arrayListType<elemType>::list;
    using arrayListType<elemType>::length;

    void insertAt(int location, const elemType& insertItem) {
        length++;
        list[location] = insertItem;
    }
};</code>

Beide Methoden teilen dem Compiler effektiv mit, dass die nicht abhängigen Namen zur geerbten Klasse gehören, und ermöglichen den erfolgreichen Fortgang der Kompilierung.

Das obige ist der detaillierte Inhalt vonWarum kann ich in einer von einer Vorlage abgeleiteten Klasse nicht auf geschützte Mitglieder meiner Basisklasse zugreifen?. 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