Especificadores de acceso para clases base
Dos factores controlan los miembros de una clase base que están accesibles en una clase derivada; estos mismos factores controlan el acceso a los miembros heredados en la clase derivada:
Si la clase derivada declara la clase base mediante el especificador de acceso public en el elemento de encabezado de clase class-head (el elemento class-head se describe en la sección de gramática del tema sobre Definir tipos de clase).
Que el acceso al miembro esté en la clase base.
En la tabla siguiente se muestra la interacción entre estos factores y cómo se determina el acceso a miembros de clase base.
Acceso a miembros de clase base
private |
protected |
Public |
---|---|---|
Siempre inaccesible independientemente del acceso de derivación |
Privado en la clase derivada si se utiliza la derivación privada |
Privado en la clase derivada si se utiliza la derivación privada |
|
Protegido en la clase derivada si se utiliza la derivación protegida |
Protegido en la clase derivada si se utiliza la derivación protegida |
|
Protegido en la clase derivada si se utiliza la derivación pública |
Público en la clase derivada si se utiliza la derivación pública |
Esto se ilustra en el siguiente ejemplo:
// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
int PublicFunc(); // Declare a public member.
protected:
int ProtectedFunc(); // Declare a protected member.
private:
int PrivateFunc(); // Declare a private member.
};
// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};
class DerivedClass2 : private BaseClass
{
};
int main()
{
}
En DerivedClass1, la función miembro PublicFunc es un miembro público y ProtectedFunc es un miembro protegido porque BaseClass es una clase base pública. PrivateFunc es privado para BaseClass, y es inaccesible en cualquiera de sus clases derivadas.
En DerivedClass2, las funciones PublicFunc y ProtectedFunc se consideran miembros privados porque BaseClass es una clase base privada. De nuevo, PrivateFunc es privado para BaseClass, y es inaccesible en cualquiera de sus clases derivadas.
Puede declarar una clase derivada sin un especificador de acceso de clase base. En tal caso, la derivación se considera privada si la declaración de clase derivada utiliza la palabra clave class. La derivación se considera pública si la declaración de clase derivada utiliza la palabra clave struct. Por ejemplo, el código siguiente:
class Derived : Base
...
equivale a:
class Derived : private Base
...
De igual forma, el código siguiente:
struct Derived : Base
...
equivale a:
struct Derived : public Base
...
Tenga en cuenta que los miembros que se declaran con acceso privado no tienen acceso a las funciones ni a las clases derivadas a menos que esas funciones o clases se declaren mediante la declaración friend en la clase base.
Un tipo union no puede tener una clase base.
Nota
Al especificar una clase base privada, es aconsejable usar explícitamente la palabra clave private para que los usuarios de la clase derivada sepan cómo es el acceso a los miembros.