Freigeben über


Zugriffsspezifizierer für Basisklassen

Zwei Faktoren steuern, auf welche Member einer Basisklasse in einer abgeleiteten Klasse zugegriffen werden kann. Dieselben Faktoren steuern den Zugriff auf geerbte Member in der abgeleiteten Klasse:

  • Gibt an, ob die abgeleitete Klasse die Basisklasse mit dem public-Zugriffsspezifizierer im class-head deklariert (class-head wird im Abschnitt zur Grammatik in Definieren von Klassentypen beschrieben).

  • Entspricht dem Zugriff auf den Member in der Basisklasse.

Die folgende Tabelle zeigt die Interaktion zwischen diesen Faktoren und wie der Zugriff auf Basisklassenmember bestimmt wird.

Memberzugriff in Basisklasse

private

protected

Public

Unabhängig vom Ableitungszugriff kann nicht zugegriffen werden

Privat in abgeleitete Klasse, wenn Sie private Ableitung verwenden

Privat in abgeleitete Klasse, wenn Sie private Ableitung verwenden

 

Geschützt in abgeleiteter Klasse, wenn Sie geschützte Ableitung verwenden

Geschützt in abgeleiteter Klasse, wenn Sie geschützte Ableitung verwenden

 

Geschützt in abgeleiteter Klasse, wenn Sie öffentliche Ableitung verwenden

Öffentlich in abgeleiteter Klasse, wenn Sie öffentliche Ableitung verwenden

Dies wird anhand des folgenden Beispiels veranschaulicht:

// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
    int PublicFunc();    // Declare a public member.
protected:
    int ProtectedFunc(); // Declare a protected member.
private:
    int PrivateFunc();   // Declare a private member.
};

// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};

class DerivedClass2 : private BaseClass
{
};

int main()
{
}

In DerivedClass1 ist die Memberfunktion PublicFunc ein öffentlicher Member und ProtectedFunc ist ein geschützter Member, da BaseClass eine öffentliche Basisklasse ist. PrivateFunc ist für BaseClass privat und für keine abgeleiteten Klassen zugänglich.

In DerivedClass2 werden die Funktionen PublicFunc und ProtectedFunc als private Member betrachtet, da BaseClass eine private Basisklasse ist. Auch hier ist PrivateFunc für BaseClass privat und für keine abgeleiteten Klassen zugänglich.

Sie können eine abgeleitete Klasse ohne einen Basisklassen-Zugriffsspezifizierer deklarieren. In einem solchen Fall gilt die Ableitung als privat, wenn die Deklaration der abgeleiteten Klasse das class-Schlüsselwort verwendet. Die Ableitung gilt als öffentlich, wenn die abgeleitete Klassendeklaration das Schlüsselwort struct verwendet. Beispielsweise folgender Code:

class Derived : Base
...

identisch mit folgendem Ausdruck:

class Derived : private Base
...

Ebenso folgender Code:

struct Derived : Base
...

identisch mit folgendem Ausdruck:

struct Derived : public Base
...

Beachten Sie, dass die Member, die deklariert werden, als hätten sie privaten Zugriff, für Funktionen oder abgeleitete Klassen nicht zugänglich sind, sofern diese Funktionen oder Klassen nicht unter Verwendung der friend-Deklaration in der Basisklasse deklariert werden.

Ein union-Typ kann keine Basisklasse haben.

Hinweis

Wenn Sie eine private Basisklasse angeben, ist es ratsam, das Schlüsselwort private explizit zu verwenden, sodass die Benutzer der abgeleiteten Klasse den Memberzugriff verstehen.

Siehe auch

Referenz

Memberzugriffssteuerung