Heim > Backend-Entwicklung > C++ > 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
Freigeben: 2024-11-01 11:38:02
Original
213 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage