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.