Partilhar via


Controle de acesso e membros estáticos

Quando você especifica uma classe base como private, isso só afeta os membros não estáticos. Os membros estáticos públicos ainda são acessíveis nas classes derivadas. No entanto, o acesso a membros da classe base usando ponteiros, referências ou objetos pode exigir uma conversão, quando então 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 acima, o controle de acesso proíbe a conversão de um ponteiro para Derived2 em um ponteiro para Base. O ponteiro this é implicitamente do tipo Derived2 *. Para selecionar a função CountOf, this deve ser convertido no tipo Base *. Essa conversão não é permitida porque Base é uma classe base indireta privada para Derived2. A conversão em um tipo de classe base privada é aceitável apenas no caso de ponteiros para as classes derivadas imediatas. Consequentemente, os ponteiros do tipo Derived1 * podem ser convertidos no tipo Base *.

Observe que chamar a função CountOf explicitamente, sem usar um ponteiro, uma referência ou um objeto para selecioná-la, não implica em nenhuma conversão. Consequentemente, a chamada é permitida.

Os membros e amigos de uma classe derivada, T, podem converter um ponteiro para T em um ponteiro para uma classe base direta privada de T.

Consulte também

Referência

Especificadores de acesso para classes base