Freigeben über


Zugriffssteuerung und statische Member

Wenn Sie eine Basisklasse als private angeben, wirkt sich dies nur auf nicht statische Member aus. Öffentliche statische Member sind in den abgeleiteten Klassen immer noch zugänglich. Zugriff auf Member der Basisklasse mithilfe von Zeigern, Verweisen oder Objekten kann jedoch eine Konvertierung erfordern, woraufhin die Zugriffssteuerung erneut übernommen wird. Betrachten Sie das folgende Beispiel:

// access_control.cpp
class Base
{
public:
    int Print();             // Nonstatic member.
    static int CountOf();    // Static member.
};

// Derived1 declares Base as a private base class.
class Derived1 : private Base
{
};
// Derived2 declares Derived1 as a public base class.
class Derived2 : public Derived1
{
    int ShowCount();    // Nonstatic member.
};
// Define ShowCount function for Derived2.
int Derived2::ShowCount()
{
   // Call static member function CountOf explicitly.
    int cCount = Base::CountOf();     // OK.

   // Call static member function CountOf using pointer.
    cCount = this->CountOf();  // C2247. Conversion of
                               //  Derived2 * to Base * not
                               //  permitted.
    return cCount;
}

Im vorherigen Code verhindert die Zugriffssteuerung die Konvertierung von einem Zeiger auf Derived2 in einen Zeiger auf Base. Der this-Zeiger ist implizit vom Typ Derived2 *. Um die CountOf-Funktion auszuwählen, muss this in den Typ Base * konvertiert werden. Eine solche Konvertierung ist nicht zulässig, da Base eine private indirekte Basisklasse für Derived2 ist. Die Konvertierung in einen privaten Typ der Basisklasse ist nur für Zeiger auf direkte abgeleitete Klassen akzeptabel. Daher können Zeiger vom Typ Derived1 * in den Typ Base * konvertiert werden.

Beachten Sie, dass der explizite Aufruf der CountOf-Funktion, ohne Verwenden eines Zeigers, Verweises oder Objekts zum Auswählen keine Konvertierung impliziert. Daher wird der Aufruf zugelassen.

Member und Friends einer abgeleiteten T-Klasse können einen Zeiger auf T in einen Zeiger auf eine private direkte Basisklasse von T konvertieren.

Siehe auch

Referenz

Zugriffsspezifizierer für Basisklassen