En la sección anterior, vimos el método de definición de clases derivadas, utilizando herencia pública. En realidad, aquí hay tres métodos, a saber, herencia pública , herencia privada y herencia protegida .
La principal diferencia entre los diferentes métodos de herencia radica en los cambios en los derechos de acceso de los miembros con diferentes derechos de acceso en la clase base en la clase derivada. Presentados uno por uno a continuación.
1. Herencia pública:
En la modalidad de herencia pública sus características son las siguientes:
(1) Los miembros públicos de la clase base siguen siendo miembros públicos de la clase derivada. Por supuesto, se puede acceder tanto a las funciones miembro como a los objetos de clase derivada de la clase derivada.
(2) Los miembros de la clase derivada ni los objetos de la clase derivada no pueden acceder a los miembros privados de la clase base.
(3) Los miembros protegidos en la clase base siguen siendo tipos protegidos en la clase derivada y se puede acceder a ellos a través de las funciones miembro de la clase derivada, pero no se puede acceder a los objetos de la clase derivada.
2. Herencia privada:
En el caso de herencia privada, los derechos de acceso de los tres miembros de tipo público, tipo privado y tipo protegido son los siguientes:
(1) Los tipos públicos y protegidos de la clase base, después de ser absorbidos por la herencia privada de la clase derivada, se convierten en los tipos privados de la clase derivada, es decir, se puede acceder a ellos en las funciones miembro de la clase y no ser accedido fuera de la clase.
(2) No se puede acceder a los miembros privados de la clase base en la clase derivada, ya sea dentro o fuera de la clase.
Podemos ver que si se trata de una derivación privada, los miembros privados de la clase base ya no se pueden usar en la clase derivada o incluso en la subclase derivada y no tienen significado, por lo que este tipo de uso es relativamente raro.
3. Proteger la herencia:
La herencia de tipo protegido tiene las siguientes características:
(1) Los miembros públicos y los miembros de tipo protegido de la clase base son miembros protegidos de la clase derivada.
(2) No se puede acceder directamente a los miembros privados de la clase base en la clase derivada.
Se puede ver que las funciones miembro de la clase derivada pueden acceder a los miembros públicos y protegidos de la clase base, pero no se puede acceder a ellos fuera de la clase a través del objeto de clase derivada. De manera similar, no se puede acceder a los miembros privados de la clase base a través de funciones miembro en la clase derivada o mediante objetos de clase.
Lo siguiente sigue tomando el código del programa de reloj y alarma como ejemplo para experimentar con diferentes tipos de problemas de acceso derivados de diferentes permisos en la clase base. Para los tipos públicos, se pueden llamar en métodos miembro de clases derivadas o fuera de la clase. La compilación se ejecuta sin errores de la siguiente manera:
Pero para los miembros privados, intentamos agregar una línea de código (consulte la línea 41). En la función miembro de la clase derivada, se asigna la variable H absorbida de la clase base y se informa un error durante la compilación. Consulte el cuadro rojo y el mensaje a continuación:
Puede ver el mensaje de error "H es un tipo privado".
Para los tipos protegidos, intentamos definir una variable de tipo protegido w en la clase base e intentamos asignarla y usarla en el método de clase derivada heredada públicamente. Puede ver la situación en la siguiente imagen, que es totalmente accesible. Como se muestra a continuación:
Para la herencia privada, se accede a miembros de tipos públicos fuera de la clase:
Puedes experimentar por tu cuenta para verificar el acceso de diferentes tipos de miembros bajo herencia pública.
Después de estudiar y experimentar, podemos resumir lo siguiente:
1. Las funciones miembro dentro o fuera de la clase derivada no pueden acceder a los miembros privados de la clase base, independientemente de los permisos derivados.
2. Herencia privada, no importa cuál sea el tipo original de la clase base, no se puede acceder a ella a través de funciones miembro fuera de la clase derivada.
3. Los derechos de acceso de los miembros absorbidos por la clase derivada de la clase base son los derechos de acceso más bajos en la clase base y los derechos derivados en el momento de la derivación.
Y según la combinación de permisos derivados, permisos definidos en la clase base y diferentes tiempos de acceso dentro y fuera de la clase derivada, se enumera la siguiente tabla:
herencia publica | herencia protegida | herencia privada | ||||
Visitar ubicación | dentro de clase | fuera de clase | dentro de clase | fuera de clase | dentro de clase | fuera de clase |
miembros públicos | Poder | Poder | Poder | No poder | Poder | No poder |
proteger a los miembros | Poder | No poder | Poder | No poder | Poder | No poder |
miembro privado | No poder | No poder | No poder | No poder | No poder | No poder |