2010-01-28 13 views
11

Estoy realmente confundido acerca de la herencia privada y la herencia protegida.¿La herencia protegida permite que la clase derivada tenga acceso a los miembros privados de su clase base?

1) en la herencia protegida, los miembros públicos y protegidos se convierten en miembros protegidos en la clase derivada. En la herencia privada, todo es privado. Sin embargo, la clase derivada nunca puede acceder a los miembros privados de la clase base, ¿verdad? La clase derivada puede acceder al público y a los miembros protegidos en ambos casos. ¿Está bien?

2) Noté que los miembros privados de la clase base nunca serán tocados por la clase derivada. Entonces, ¿por qué los miembros privados son heredados?

Respuesta

32

Tiene la razón en el punto n. ° 1. Especificar private, protected o public cuando hereda de una clase base no cambia nada el acceso a la misma clase derivada. Esos especificadores de acceso le dicen al compilador cómo tratar a los miembros de la clase base cuando las instancias de la clase derivada se usan en otro lugar, o si la clase derivada se usa como una clase base para otras clases.

UPDATE: Lo siguiente puede ayudar a ilustrar las diferencias:

class Base 
{ 
    private: int base_pri; 
    protected: int base_pro; 
    public: int base_pub; 
}; 

Para las clases de derivados de la base:

class With_Private_Base : private Base { void memberFn(); }; 
class With_Protected_Base : protected Base { void memberFn(); }; 
class With_Public_Base : public Base { void memberFn(); }; 

// this would be the same for all of the above 3 classes: 
void With_PXXX_Base::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

Para las clases de derivados de las 3 clases derivadas:

class A : public With_Private_Base { void memberFn(); } 
void A::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // error: `int Base::base_pro' is protected 
    base_pub = 1; // error: `int Base::base_pub' is inaccessible 
} 

class B : public With_Protected_Base { void memberFn(); } 
void B::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

class C : public With_Public_Base { void memberFn(); } 
void C::memberFn() 
{ 
    base_pri = 1; // error: `int Base::base_pri' is private 
    base_pro = 1; // OK 
    base_pub = 1; // OK 
} 

Acceso externo a las tres primeras clases derivadas:

void main() 
{ 
    With_Private_Base pri_base; 
    pri_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pri_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible 

    With_Protected_Base pro_base; 
    pro_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pro_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible 

    With_Public_Base pub_base; 
    pub_base.base_pri = 1; // error: `int Base::base_pri' is private 
    pub_base.base_pro = 1; // error: `int Base::base_pro' is protected 
    pub_base.base_pub = 1; // OK 
} 
+0

herencia protegida y herencia pública son las mismas? –

+0

@fahad: desde el punto de vista de la clase derivada, sí, lo son. Desde un punto de vista de acceso externo (el último bloque de código en mi respuesta) son bastante diferentes. –

0

1) Estás en lo cierto. Ningún tipo de herencia permite el acceso a miembros privados (solo las declaraciones friend lo permiten)

2) Se "heredan" en el sentido de que un objeto de tipo Derivado, cuando se almacena en la memoria, incluye todos los datos miembros de Derived y Base, incluidos los miembros privados de Base. Los miembros privados no pueden simplemente irse ya que cuando los métodos de Base se ejecutan en ese objeto, necesitarán acceder a los miembros privados de Base.

Además, los nombres de los miembros privados de Base tienen un alcance técnico en los métodos de Derived, pero por supuesto obtendrá un error de compilación si intenta acceder a ellos.

3

1a) Herencia protegida significa que el "niño" puede acceder a todo lo que podría en herencia pública, pero otros que usan ese objeto solo pueden ver la interfaz pública para el niño, cualquier elemento de su padre está oculto.

1b) La herencia privada da como resultado que todas las funciones públicas de una clase se hereden como funciones privadas, lo que significa que no pueden ser llamadas desde el niño o acceder desde un cliente de su objeto.

2) Los miembros privados se heredan porque es posible que los métodos de la clase base necesiten que funcionen.

1

1) en la herencia protegida, el miembros públicos y protegidos se convierten miembros protegidas en la clase derivada . En la herencia privada, todo es privado. Sin embargo, la clase derivada nunca puede acceder a los miembros privados de la clase base, es ese derecho?

Sí.

La clase derivada puede el acceso al público y protegido miembros en ambos casos. ¿Está bien?

Sí.

2) me di cuenta de que los miembros privados de la clase base no se tocado por la clase derivada. Entonces, ¿por qué son los miembros privados heredados?

Porque son parte de la clase base, y necesita la clase base que es parte de su clase derivada.Tenga en cuenta que aún puede manipular algún estado (si lo hubiera) mantenido en la clase base utilizando funciones de miembro que no hayan sido reemplazadas por public/protected.

2
  1. Sí, esto es correcto. Las clases derivadas pueden acceder a los miembros protegidos y públicos de su clase base, y la clase derivada no puede acceder a los miembros privados de su clase base.

  2. Los miembros privados se heredan por la siguiente razón: La clase base puede definir una función protegida o pública que modifica el miembro privado de la clase base. La clase derivada puede llamar a esta función y, por lo tanto, necesita conocer la variable privada a la que está accediendo.

Cuestiones relacionadas