Udostępnij za pośrednictwem


Kontrola dostępu i statyczne składniki

Po określeniu klasy bazowej zgodnie z private, dotyczy ona tylko członków niestatycznych.Publiczne statyczne elementy członkowskie są nadal dostępne w klasach pochodnych.Uzyskiwanie dostępu do członków klasy podstawowej za pomocą wskaźników, odwołania lub obiektów może jednak wymagać konwersji, w czasie których ponownie zostanie zastosowana kontrola dostępu.Rozważmy następujący przykład:

// 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;
}

W poprzednim kodzie kontrola dostępu zakazuje konwersji z wskaźnik Derived2 do wskaźnika Base.Wskaźnik this jest niejawnie typu Derived2 *.Aby wybrać funkcję CountOf, this musi zostać przekonwertowane na typ Base *.Takia konwersja jest niedozwolona, ponieważ Base jest prywatny niebezpośrednio dla klasy podstawowej do Derived2.Konwersja do typu prywatnej klasy podstawowej jest dopuszczalna tylko dla wskaźników do bezpośrednich klas pochodnych.W związku z tym, wskaźniki typu Derived1 * mogą zostać przekonwertowane na typ Base *.

Należy zauważyć, że wywołanie jawne funkcji CountOf bez użycia wskaźnika, odwołania lub obiektu, aby go zaznaczyć nie pociąga za sobą konwersji.Jednakże wywołanie jest dozwolone.

Członkowie i przyjaciele klasy pochodnej T mogą przekonwertować wskaźnik do T do wskaźnika do prywatnej bezpośredniej klasy podstawowej T.

Zobacz też

Informacje

Specyfikatory dostępu dla klas podstawowych