Управление доступом и статические элементы
Если указан базовый класс как 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.