Controle de acesso e membros estáticos
Quando você especifica uma classe base como private, ela afeta somente os membros não estático.Membros estáticos públicos são ainda acessíveis nas classes derivadas.No entanto, o acesso a membros da classe base usando objetos, referências ou ponteiros pode exigir uma conversão, momento em que o controle de acesso é aplicado novamente.Considere o exemplo a seguir:
// 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;
}
No código anterior, o controle de acesso proíbe a conversão de um ponteiro para Derived2 para um ponteiro para Base.O Este ponteiro é implicitamente do tipo Derived2 *.Para selecionar o CountOf função, Este deve ser convertido no tipo Base *.Tal conversão não é permitido porque Base é uma classe de base indireta particular para Derived2.Conversão em um tipo de classe base privada só é aceitável para ponteiros para as classes derivadas de imediatos.Portanto, os ponteiros do tipo Derived1 * pode ser convertido no tipo Base *.
Observe que a chamada a CountOf função explicitamente, sem usar um ponteiro, uma referência ou um objeto para selecioná-lo, não implica nenhuma conversão.Portanto, a chamada é permitida.
Os membros e amigos de uma classe derivada, T, pode converter um ponteiro para T para um ponteiro para uma classe de base privada direta de T.