Especificadores de acesso para Classes de Base
Controle de dois fatores quais membros de uma classe base podem ser acessados em uma classe derivada; Esses fatores mesmos controlam o acesso aos membros herdados na classe derivada:
Se a classe derivada declara a classe base usando o pública acessar o especificador na head de classe (head de classe é descrito na seção de gramática Tipos de definição de classe).
O que o acesso ao membro é na classe base.
A tabela a seguir mostra a interação entre esses fatores e como determinar o acesso de membro da classe base.
Acesso de membro na classe Base
Particular |
Protegido |
Público |
---|---|---|
Sempre inacessível, independentemente do acesso de derivação |
Private na classe derivada, se você usar a derivação particular |
Private na classe derivada, se você usar a derivação particular |
|
Protegido na classe derivada, se você usar a derivação protegida |
Protegido na classe derivada, se você usar a derivação protegida |
|
Protegido na classe derivada, se você usar a derivação pública |
Público na classe derivada, se você usar a derivação pública |
O exemplo a seguir ilustra isso:
// 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()
{
}
Na DerivedClass1, a função de membro PublicFunc é um membro público e ProtectedFunc é um membro protegido porque BaseClass é uma classe base pública.PrivateFuncé privativo de BaseClass, e ele não está acessível a qualquer classes derivadas.
Na DerivedClass2, as funções PublicFunc e ProtectedFunc são considerados membros particulares porque BaseClass é uma classe base particular.Novamente, PrivateFunc é privativo de BaseClass, e ele não está acessível a qualquer classes derivadas.
Você pode declarar uma classe derivada, sem um especificador de acesso de classe base.Nesse caso, a derivação é considerada particular se a declaração de classe derivada usa a classe palavra-chave.A derivação é considerada pública se a declaração de classe derivada usa a struct palavra-chave.Por exemplo, o código a seguir:
class Derived : Base
...
é equivalente a:
class Derived : private Base
...
Da mesma forma, o código a seguir:
struct Derived : Base
...
é equivalente a:
struct Derived : public Base
...
Observe que os membros declarados como tendo acesso particular não estão acessíveis para funções ou classes derivadas, a menos que essas funções ou classes são declaradas usando a friend declaração na classe base.
A união tipo não pode ter uma classe base.
Observação |
---|
Ao especificar uma classe base particular, é aconselhável usar explicitamente a private palavra-chave para que os usuários da classe derivada compreendem o acesso de membro. |