Está en la página 1de 19

1

HERENCIA
Por: Yolanda Martnez Trevio

Herencia
2

La herencia es un concepto que permite definir una clase general para despus definir otras clases ms especializadas, agregando detalles a la declaracin de cada una de estas clases especializadas. Computacionalmente, la herencia es el proceso mediante el cual se crea una clase nueva, llamada clase derivada o clase hija, a partir de otra clase, llamada clase base o clase padre.
Esta es la clase general, tambin se llama clase Padre Esta es la clase especializada, tambin se llama clase Hijo

Herencia
3

Las clases derivadas heredan todas las propiedades de la clase base; es decir, heredan sus atributos (datos) y sus mtodos (funciones). Despus de desarrollar la clase general solo tienes que escribir la diferencia o especializacin de cdigo para cada clase hija. Se puede desarrollar una jerarqua de clases derivando clases de las clases hijas (es decir, las clases hijas pueden a su vez ser padres de otras clases)

Ejemplo de Herencia
4

Se puede tener una clase general Persona que tenga nombre y edad; sus mtodos de acceso y modificacin y un mtodo para mostrar los datos en la pantalla. Despus, se puede disear la clase Estudiante, la cual debe tener nombre y edad, adems de la carrera que estudia. En este caso, se puede utilizar la herencia para heredar el nombre y la edad y sus mtodos relacionados y solo agregar los elementos que se requieren para un estudiante. De manera similar, se puede disear la clase Maestro; pensando que adems del nombre y edad se requiere el departamento para el que da clases.

Ejemplo de Herencia:
5

Clase Base

Clases Derivadas

Ejemplo de Herencia:
6

Clase: Atributos: Mtodos:

Persona nombre, edad. setNombre, setEdad, getNombre, getEdad, muestra.

Esta ser la clase base de la cual heredarn las clases derivadas.

Ejemplo de Herencia:
7

Clase: Atributos: Mtodos:

Estudiante carrera setCarrera, getCarrera, muestra.

Clase Base

Clase Derivada: Estudiante Esta ser la clase derivada que heredar de la clase Persona sus atributos (nombre y edad) y mtodos (setNombre, setEdad, getNombre, getEdad, print).

Ejemplo de Herencia:
8

Clase: Atributos: Mtodos:

Maestro depto setDepto, getDepto, muestra.

Clase Base

Clase Derivada: Maestro Clase derivada que heredar de la clase Persona sus atributos (nombre y edad) y mtodos (setNombre, setEdad, getNombre, getEdad, print).

Herencia en C++
9

Para indicar que una clase es una clase derivada de otra se utiliza el siguiente formato: class ClaseDerivada : public ClaseBase Recuerda que la clase derivada hereda todos los atributos (o datos miembro) y todos los mtodos (o funciones miembro) de la clase base. Sin embargo, la clase derivada solamente puede utilizar los elementos que no son privados de la clase base; es decir, para utilizar los datos miembro privados de la clase base requiere hacerlo a travs de los mtodos de acceso y modificacin.

Modificadores de acceso
10

Los atributos y mtodos de una clase pueden ser:


public: Pueden ser usados afuera de la clase. private: Slo se pueden usar por sus funciones miembro y friend, no se heredan. protected: pueden ser usados por sus funciones miembro y friend y adems por las funciones miembro y friend de sus clases derivadas.

Herencia en C++
11

Para nuestro ejemplo tenemos las siguientes declaraciones:


Persona.h class Persona {public: Persona(); Persona(string, int); string getNombre(); void setNombre(string); int getEdad(); void setEdad(int); void muestraDatos(); protected: string nombre; int edad; }; Estudiante.h #include "Persona.h" Indica que es una clase derivada de la clase Persona

class Estudiante : public Persona { public: Estudiante(); Estudiante(string, int, string); string getCarrera(); void setCarrera(string); void muestraDatos(); private: string carrera; };

Herencia en C++: clase Persona


12

Persona::Persona() { nombre = "N/A"; edad = 0; } Persona::Persona(string nom, int ed) { nombre = nom; edad = ed; } string Persona::getNombre() { return nombre; }

void Persona::setNombre(string nom) { nombre = nom; } int Persona::getEdad() { return edad; } void Persona::setEdad(int ed) { edad = ed; } void Persona::muestraDatos() { cout<<"Nombre: "<<nombre<<" edad: "<<edad; }

Herencia en C++: Clase Estudiante


13

Estudiante::Estudiante() : Persona() { carrera = "N/A"; }

Para llamar al constructor default de la clase base.

Estudiante::Estudiante(string nom, int ed, string ca) : Persona(nom, ed) { carrera = ca; } string Estudiante::getCarrera() { return carrera; } void Estudiante::setCarrera(string ca) { carrera = ca; }

Para llamar al constructor con parmetros de la clase base.

Nota que uso directamente los atributos heredados de la clase base.

void Estudiante::muestraDatos() { cout<<"Nombre: "<<nombre<<" edad: "<<edad<<" Carrera: "<<carrera; }

Herencia en C++: Aplicacin


14

#include "Estudiante.h" int main() { Estudiante juan("Juan", 25, "ISD"), laura; Persona rosa("Rosa", 8), pedro; cout<<"Los datos del estudiante 1 son: "<<endl; juan.muestraDatos(); cout<<"Los datos del estudiante 2 son: "<<endl; cout<<"Nombre "<<laura.getNombre()<<" Edad: <<laura.getEdad()<<" Carrera "<<laura.getCarrera(); cout<<"Los datos de la persona 1 son: "<<endl; rosa.muestraDatos(); cout<<"Los datos de la persona 2 son: "<<endl;

En el programa se eliminaron los cout<<endl; para que cupiera en el filmina.

cout<<"Nombre "<<pedro.getNombre()<<" Edad: "<<pedro.getEdad(); return 0; }

15

Algunos detalles importantes: protected


Para que la clase derivada utilice directamente los datos miembros de la clase base, estos se deben declarar como protected. Tambin es posible utilizar los datos en la clase base de tipo privado y usarlos en las clases derivadas a travs de sus mtodos de acceso y modificacin. Esto evita que por algn error la clase derivada pueda poner algn valor invlido a un dato de la clase base. En el ejemplo estamos utilizando datos de tipo protegido, pero podramos haberlo hecho usando datos privados.

16

Algunos detalles importantes: constructor de la clase derivada


Lo primero que debe hacer un constructor de una clase derivada es llamar al constructor de su clase base. Si el constructor no incluye dicha llamada, C++ coloca una llamada implcita al constructor default de la clase base. En este caso, si la clase base no incluye un constructor default, el compilador marcar un error.

Redefinir un mtodo
17

Nota que en la clase Persona existe el mtodo muestraDatos y en la clase Estudiante tambin existe el mtodo muestraDatos.

En la implementacin de la clase Estudiante, se est redefiniendo el mtodo muestraDatos.

Redefinir un mtodo
18

Para redefinir un mtodo, una clase derivada define de nuevo el mtodo con exactamente el mismo encabezado que ste tiene en la clase base; con esto se consigue que un objeto de la clase derivada tenga su propia versin de dicho mtodo. En el ejemplo un objeto de la clase Estudiante no puede utilizar el mtodo muestraDatos de la clase Persona porque solamente mostrara nombre y edad y no mostrara la carrera; entonces es necesario redefinir el mtodo para adaptarlo a los cambios que tiene la clase derivada con respecto a la clase base.

Redefinir un mtodo
19

Para redefinir un mtodo, ste debe tener el mismo nombre y lista de parmetros que el mtodo al que sustituye. Si no se cumple este requisito, se heredara el mtodo de la clase base y la clase derivada tendra otro mtodo con el mismo nombre. Esto no es redefinicin sino sobrecarga de nombres.

También podría gustarte