Saltar al contenido

Diferencia entre herencia privada, pública y protegida

Hola, encontramos la respuesta a tu búsqueda, desplázate y la obtendrás un poco más abajo.

Solución:

class A 

public:
    int x;
protected:
    int y;
private:
    int z;
;

class B : public A

    // x is public
    // y is protected
    // z is not accessible from B
;

class C : protected A

    // x is protected
    // y is protected
    // z is not accessible from C
;

class D : private A    // 'private' is default for classes

    // x is private
    // y is private
    // z is not accessible from D
;

NOTA IMPORTANTE: Las clases B, C y D contienen todas las variables x, y y z. Es solo una cuestión de acceso.

Sobre el uso de la herencia protegida y privada, puede leer aquí.

Para responder a esa pregunta, me gustaría describir los accesos de los miembros primero con mis propias palabras. Si ya sabe esto, salte al encabezado “siguiente:”.

Hay tres accesorios que conozco: public, protected y private.

Dejar:

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 niños (y sus hijos) son conscientes de que Base contiene protectedMember.
  • nadie mas Base es consciente de privateMember.

Por “es consciente de”, me refiero a “reconocer la existencia de, y por lo tanto ser capaz de acceder”.

Siguiente:

Lo mismo sucede con la herencia pública, privada y protegida. Consideremos una clase Base y una clase Child que hereda de Base.

  • Si la herencia es publictodo lo que es consciente de Base y Child también es consciente de que Child hereda de Base.
  • Si la herencia es protectedsolamente Childy sus hijos, son conscientes de que heredan de Base.
  • Si la herencia es privatenadie más que Child es consciente de la herencia.

Limitar la visibilidad de la herencia hará que el código no pueda ver que alguna clase hereda otra clase: las conversiones implícitas de la derivada a la base no funcionarán, y static_cast de la base a la derivada tampoco funcionará.

Solo los miembros/amigos de una clase pueden ver la herencia privada y solo los miembros/amigos y las clases derivadas pueden ver la herencia protegida.

público herencia

  1. ES-A herencia. Un botón es una ventana, y en cualquier lugar donde se necesite una ventana, también se puede pasar un botón.

    class button : public window  ;
    

protegido herencia

  1. Protegido implementado-en-términos-de. Raramente útil. Utilizado en boost::compressed_pair para derivar de clases vacías y ahorrar memoria usando la optimización de clase base vacía (el ejemplo a continuación no usa una plantilla para seguir en el punto):

    struct empty_pair_impl : protected empty_class_1 
     non_empty_class_2 second; ;
    
    struct pair : private empty_pair_impl 
      non_empty_class_2 &second() 
        return this->second;
      
    
      empty_class_1 &first() 
        return *this; // notice we return *this!
      
    ;
    

privado herencia

  1. Implementado en términos de. El uso de la clase base es solo para implementar la clase derivada. Útil con rasgos y si el tamaño importa (los rasgos vacíos que solo contienen funciones harán uso de la optimización de la clase base vacía). A menudo contención es la mejor solución, sin embargo. El tamaño de las cadenas es crítico, por lo que es un uso frecuente aquí.

    template
    struct string : private StorageModel 
    public:
      void realloc() 
        // uses inherited function
        StorageModel::realloc();
      
    ;
    

público miembro

  1. Agregar

    class pair 
    public:
      First first;
      Second second;
    ;
    
  2. Accesorios

    class window 
    public:
        int getWidth() const;
    ;
    

protegido miembro

  1. Proporcionar acceso mejorado para clases derivadas

    class stack 
    protected:
      vector c;
    ;
    
    class window 
    protected:
      void registerClass(window_descriptor w);
    ;
    

privado miembro

  1. Mantener detalles de implementación

    class window 
    private:
      int width;
    ;
    

Tenga en cuenta que las conversiones de estilo C permiten deliberadamente convertir una clase derivada en una clase base protegida o privada de una manera definida y segura y también en la otra dirección. Esto debe evitarse a toda costa, ya que puede hacer que el código dependa de los detalles de implementación, pero si es necesario, puede utilizar esta técnica.

Te mostramos las comentarios y valoraciones de los lectores

Eres capaz de añadir valor a nuestra información cooperando tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *