Na seção anterior, vimos o método de definição de classes derivadas, usando herança pública. Na verdade, existem três métodos aqui, ou seja, herança pública , herança privada e herança protegida .
A principal diferença entre os diferentes métodos de herança está nas alterações nos direitos de acesso dos membros com diferentes direitos de acesso na classe base na classe derivada. Apresentado um por um abaixo.
1. Herança pública:
Na modalidade de herança pública, suas características são as seguintes:
(1) Os membros públicos na classe base ainda são membros públicos na classe derivada. É claro que tanto as funções de membro quanto os objetos da classe derivada na classe derivada podem ser acessados.
(2) Membros privados na classe base não podem ser acessados por membros da classe derivada ou objetos da classe derivada.
(3) Os membros protegidos na classe base ainda são tipos protegidos na classe derivada e podem ser acessados por meio das funções de membro da classe derivada, mas os objetos da classe derivada não podem ser acessados.
2. Herança privada:
No caso de herança privada, os direitos de acesso dos três membros do tipo público, tipo privado e tipo protegido são os seguintes:
(1) Os tipos públicos e protegidos da classe base, após serem absorvidos pela herança privada da classe derivada, tornam-se os tipos privados da classe derivada, ou seja, podem ser acessados nas funções membro da classe e não podem ser acessado fora da aula.
(2) Os membros privados da classe base não podem ser acessados na classe derivada, seja dentro ou fora da classe.
Podemos ver que se for uma derivação privada, os membros privados da classe base não podem mais ser usados na classe derivada ou mesmo na subclasse derivada, e não têm significado, então esse tipo de uso é relativamente raro.
3. Proteja a herança:
A herança de tipo protegido possui as seguintes características:
(1) Membros públicos e membros de tipo protegido da classe base são membros protegidos na classe derivada.
(2) Os membros privados da classe base não podem ser acessados diretamente na classe derivada.
Pode-se observar que as funções-membro da classe derivada podem acessar os membros públicos e protegidos da classe base, mas não podem ser acessadas fora da classe por meio do objeto da classe derivada. Da mesma forma, membros privados na classe base não podem ser acessados por meio de funções-membro na classe derivada ou por meio de objetos de classe.
A seguir, ainda tomamos o código do programa relógio e despertador como exemplo para experimentar diferentes tipos de problemas de acesso derivados de diferentes permissões na classe base. Para tipos públicos, eles podem ser chamados em métodos membros de classes derivadas ou fora da classe. A compilação é executada sem erros da seguinte forma:
Mas para membros privados, tentamos adicionar uma linha de código, consulte a linha 41. Na função membro da classe derivada, a variável H absorvida da classe base é atribuída e um erro é relatado durante a compilação. Veja a caixa vermelha e o prompt abaixo:
Você pode ver a mensagem de erro "H é um tipo privado".
Para tipos protegidos, tentamos definir uma variável de tipo protegido w na classe base e tentamos atribuí-la e usá-la no método de classe derivada herdada publicamente. Você pode ver a situação na imagem abaixo, que é totalmente acessível. Conforme mostrado abaixo:
Para herança privada, membros de tipos públicos são acessados fora da classe:
Você pode experimentar por conta própria para verificar o acesso de diferentes tipos de membros sob herança pública.
Depois de estudar e experimentar, podemos resumir da seguinte forma:
1. Membros privados da classe base não podem ser acessados por funções de membro dentro ou fora da classe derivada, independentemente das permissões derivadas.
2. Herança privada, não importa qual seja o tipo original da classe base, ela não pode ser acessada por meio de funções-membro fora da classe derivada.
3. Os direitos de acesso dos membros absorvidos pela classe derivada da classe base são os mais baixos dos direitos de acesso na classe base e os direitos derivados no momento da derivação.
E com base na combinação de permissões derivadas, permissões definidas na classe base e diferentes tempos de acesso dentro e fora da classe derivada, a tabela a seguir é listada:
herança pública | herança protegida | herança privada | ||||
Visite o local | dentro da aula | Fora da aula | dentro da aula | Fora da aula | dentro da aula | Fora da aula |
membros públicos | Pode | Pode | Pode | Não pode | Pode | Não pode |
proteger membros | Pode | Não pode | Pode | Não pode | Pode | Não pode |
membro privado | Não pode | Não pode | Não pode | Não pode | Não pode | Não pode |