Usuario anónimo
Diferencia entre herencia privada, pública y protegida
¿Cuál es la diferencia entre la herencia pública
, privada
y protegida
en C++? Todas las preguntas que he encontrado en SO tratan de casos específicos.
947
3
Para responder a esta pregunta, me gustaría describir primero los accesorios de los miembros con mis propias palabras. Si ya lo sabes, pasa al apartado "siguiente:".
Hay tres accesores que conozco:
public
,protected
yprivate
.Deja:
Base
también es consciente de queBase
contienepublicMember
.Base
contieneprotectedMember
.Base
conoce aprivateMember
.Por "es consciente de", me refiero a "reconocer la existencia de, y por lo tanto ser capaz de acceder".
siguiente:
Lo mismo ocurre con la herencia pública, privada y protegida. Consideremos una clase
Base
y una claseChild
que hereda deBase
.pública
, todo lo que conoce aBase
yChild
también sabe queChild
hereda deBase
.protegida
, sóloChild
, y sus hijos, son conscientes de que heredan deBase
.privada
, nadie más queChild
es consciente de la herencia.Tiene que ver con la forma en que los miembros públicos de la clase base se exponen desde la clase derivada.
Como señala litb, la herencia pública es la herencia tradicional que verás en la mayoría de los lenguajes de programación. Es decir, modela una relación "IS-A". La herencia privada, algo AFAIK peculiar de C++, es una relación "IMPLEMENTADA EN TÉRMINOS DE". Es decir, quieres utilizar la interfaz pública en la clase derivada, pero no quieres que el usuario de la clase derivada tenga acceso a esa interfaz. Muchos argumentan que en este caso se debe agregar la clase base, es decir, en lugar de tener la clase base como una base privada, hacer en un miembro de derivados con el fin de reutilizar la funcionalidad de la clase base.
Es esencialmente la protección de acceso de los miembros públicos y protegidos de la clase base en la clase derivada. Con la herencia pública, la clase derivada puede ver los miembros públicos y protegidos de la base. Con la herencia privada, no puede. Con protected, la clase derivada y cualquier clase derivada de ella pueden verlos.