[C con Clase] herencia

Steven Davidson srd4121 en njit.edu
Jue Oct 7 20:52:37 CEST 2010


Hola Wolf,

On 10/7/2010 12:41 PM, wolf wrote:
> buenas tardes ola otra ves conclase..
>
> tengo una duda sobre herencia de clases en c++...
> si se dice que la clase derivada hereda datos y funciones miembros
> dela clase base, entonces quiere decir que hereda los miembros datos
> declarados en la zona privada de la clase base?...pero si es asi

Correcto.

> entonces porke es imposible accederlos si se supone que si los hereda
> es porque tiene la posibilidad de manejarlos..ojala me deje entender

Hay una diferencia entre la herencia - miembros de una clase base forman 
parte de otra clase derivada - y el permiso de acceso a los miembros. 
Puedes pensar que al heredar los miembros de la clase base, también 
heredamos sus permisos asociados a tales miembros. Por ejemplo,

class Base
{
private:
   int dato;
   float precio;

protected:
   char *pNombre;
   unsigned long int id;

public:
   int pubNum;
};

class Derivada : public Base
{
private:
   int num1, num2, num3;
};
...
Derivada der;

El objeto 'der' contiene los miembros de 'Base' (20 bytes) y los suyos 
(12 bytes) ocupando 32 bytes en memoria, si 'int', 'float', y 
direcciones de memoria ocupan 4 bytes cada uno.


La razón de no tener permiso de acceso directo a los miembros privados 
es por mantener la validez del "sistema de permisos". Si un miembro es 
privado, entonces debe ser privado en cualquier situación. De lo 
contrario, no serviría porque entonces podríamos derivar de la clase 
base para poder acceder directamente a esos miembros privados. Esto 
cancelaría el propósito de la privacidad.

Por otro lado, podemos cambiar el permiso de acceso al derivar, pero 
solamente a un permiso con mayor restricción. Por ejemplo,

class Derivada : protected Base
{
   ...
};

Ahora, todos los miembros heredados tienen como mínimo el permiso 
"protegido" de acceso. Esto significa que 'Derivada' tiene los 
siguientes miembros heredados:

private:
   int dato;
   float precio;

protected:
   char *pNombre;
   unsigned long int id;
   int pubNum;

Vemos que 'pubNum' es ahora "protegido". Esto implica que, 
'Base::pubNum' es público, pero 'Derivada::pubNum' está protegido. 
También observa que los datos privados de 'Base' siguen siendo privados 
en 'Derivada'.

También podemos heredar privadamente:

class Derivada : private Base
{
   ...
};

Esto es algo raro de hacer, pero posible. Básicamente, sólo las clases 
"amigas" tienen acceso a estos miembros privados.


Espero haber aclarado la duda.

Steven





Más información sobre la lista de distribución Cconclase