Управление доступом и статические элементы

Если указан базовый класс как privateон затрагивает только нестатические члены.Общие статические члены все еще доступны в производных классах.Однако доступ к членам базового класса, используя указатели, ссылки и объекты могут потребовать преобразования, в котором момент управление доступом повторно применено.Рассмотрим следующий пример:

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

В приведенном выше коде управление доступом запрещает преобразование из указателя в Derived2 к указателю на Base.this указатель неявно типа Derived2 *.Выбрать CountOf функция this быть преобразовано в тип Base *.Запрещено, потому, что такое преобразование Base закрытый косвенный базовый класс для Derived2.Преобразование закрытому типу базового класса допустимо только для указателей на непосредственный производным классам.Поэтому указатели типа Derived1 * может быть преобразовано в тип Base *.

Обратите внимание, что вызывающий CountOf функция явно, без использования указателя ссылка или объект, чтобы выбрать его, не подразумевает преобразование.Поэтому вызов допускается.

Члены и друзья производного класса Tможет преобразовать указатель на T к указателю закрытому прямой базовый класс T.

См. также

Ссылки

Описатели доступа для базовых классов