Especificadores de Access para las clases base
Control de dos factores que los miembros de una clase base 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 de Público en el clase-cabezal (el clase-cabezal se describe en la sección de la gramática de Definir tipos de clase).
Lo que el acceso al miembro está en la clase base.
La tabla siguiente se muestra la interacción entre estos factores y cómo determinar el acceso a miembros de clase base.
Acceso a miembros de clase base
private |
protected |
Public |
---|---|---|
Siempre inaccesible independientemente del acceso de derivación |
Private en la clase derivada si utiliza la derivación privada |
Private en la clase derivada si utiliza la derivación privada |
|
Protegido en clase derivada si utiliza la derivación protegida |
Protegido en clase derivada si utiliza la derivación protegida |
|
Protegido en clase derivada si utiliza la derivación pública |
Público en la clase derivada si 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 PublicFunc miembro es un miembro público y ProtectedFunc es miembro protegido porque BaseClass es una clase base pública.PrivateFunc es privado a BaseClass, y es inaccesible en sus clases derivadas.
En DerivedClass2, las funciones PublicFunc y ProtectedFunc se consideran miembros privados porque BaseClass es una clase base privada.Una vez más PrivateFunc es privado a BaseClass, y es inaccesible en sus clases derivadas.
Puede declarar una clase derivada sin un especificador de acceso de la clase base.En este caso, la derivación se considera privada si la declaración de clase derivada utiliza la palabra clave de clase .La derivación se considera público si la declaración de clase derivada utiliza la palabra clave de 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
...
Observe que los miembros declarados como si tuvieran acceso privado no tienen acceso a las funciones o clases derivadas a menos que esas funciones o clases se declaran mediante la declaración de friend en la clase base.
un tipo de union no puede tener una clase base.
[!NOTA]
Al especificar una clase base privada, es aconsejable explícitamente utilizar la palabra clave de private de manera que los usuarios de la clase derivada comprender el acceso a miembros.