¿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.
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
y private
.
Deja:
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
Base
también es consciente de que Base
contiene publicMember
.Base
contiene protectedMember
.Base
conoce a privateMember
.Por "es consciente de", me refiero a "reconocer la existencia de, y por lo tanto ser capaz de acceder".
Lo mismo ocurre con la herencia pública, privada y protegida. Consideremos una clase Base
y una clase Child
que hereda de Base
.
pública
, todo lo que conoce a Base
y Child
también sabe que Child
hereda de Base
.protegida
, sólo Child
, y sus hijos, son conscientes de que heredan de Base
.privada
, nadie más que Child
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.