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.

Solución

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;
};
  • Todo lo que es consciente de Base también es consciente de que Base contiene publicMember.
  • Sólo los hijos (y sus hijos) saben que Base contiene protectedMember.
  • Nadie más que Base conoce a privateMember.

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 clase Child que hereda de Base.

  • Si la herencia es pública, todo lo que conoce a Base y Child también sabe que Child hereda de Base.
  • Si la herencia es protegida, sólo Child, y sus hijos, son conscientes de que heredan de Base.
  • Si la herencia es privada, nadie más que Child es consciente de la herencia.
Comentarios (12)

Tiene que ver con la forma en que los miembros públicos de la clase base se exponen desde la clase derivada.

  • public -> los miembros públicos de la clase base serán públicos (normalmente el valor por defecto)
  • protected -> los miembros públicos de la clase base serán protegidos
  • privado -> los miembros públicos de la clase base serán privados

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.

Comentarios (2)

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.

Comentarios (0)