Control de acceso y miembros estáticos

Cuando se especifica una clase base como private, solo afecta a los miembros no estáticos. Los miembros estáticos públicos siguen siendo accesibles en las clases derivadas. Sin embargo, el acceso a los miembros de la clase base mediante el uso de punteros, referencias u objetos puede requerir una conversión en la que se aplica de nuevo el control de acceso de tiempo. Considere el ejemplo siguiente:

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

En el código anterior, el control de acceso prohíbe la conversión de un puntero a Derived2 en un puntero a Base. El puntero this es implícitamente de tipo Derived2 *. Para seleccionar la función CountOf, this se debe convertir al tipo Base *. Este tipo de conversión no está permitido porque Base es una clase base indirecta privada a Derived2. La conversión a un tipo de clase base privada solo es aceptable para punteros a clases derivadas inmediatas. Por lo tanto, los punteros de tipo Derived1 * pueden convertirse al tipo Base *.

Observe que la llamada explícita a la función CountOf, sin utilizar un puntero, una referencia o un objeto para seleccionarla, no implica ninguna conversión. Por lo tanto, se permite la llamada.

Los miembros y objetos friend de una clase derivada, T, pueden convertir un puntero a T en un puntero a una clase base directa privada de T.

Vea también

Referencia

Especificadores de acceso para clases base