Está en la página 1de 16

Programacin I

UNIDAD 5

HERENCIA 1.- IMPORTANCIA DE LA HERENCIA EN POO 2.- JERARQUIA DE HERENCIAS 2.1.-CONCEPTO DE LA HERENCIA SIMPLE Y MULTIPLE 2.1.-PRINCIPIOS GENERALES DE DISEO DE JERARQUAS 2.3.-ESPECIFICADORES DE ACCESO A JERARQUA DE CLASES 3.- CLASE BASE 3.1.-DEFINICIN 3.2.-ATRIBUTOS 4.- DEFINICIN DE UNA CLASE DERIVADA 4.1.-CONSTRUCTORES Y DESTRUCTORES DE CLASES DERIVADAS 4.2.-CONVERSIN IMPLICITA DE OBJETOS DE CLASE DERIVADA A OBJETOS DE UNA CLASE BASE 5. HERENCIAS MLTIPLES

1
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Herenci a La herencia es la propiedad que permite a los objetos construirse a partir de otros objetos. Importancia de la Herencia en Poo La herencia, juega un papel fundamental en la Poo, con ello se ha logrado, a travs de las clases, pasar de una clase a ot ra, ciertas caractersticas, mtodos, parametros, funciones y atributos de una clase, entre dos objetos con relacin. Permite el ahorro de cdigo y la combinacin de clases. En C++, la herencia simple se realiza tomando una clase existente y derivando nue vas clases de ella. La clase derivada hereda las estructuras de datos y funciones de la clase original. Adems, se pueden aadir nuevos miembros a las clases derivadas y los miembros heredados pueden ser modificados. Una clase utilizada para derivar nuevas clases se denomina clase base, clase padre, superclase o ascendiente. Una clase creada de otra clase se denomina clase derivada o subclase. Se pueden construir jerarquas de clases, en las que cada clase sirve como padre o raz de una nueva clase. Conceptos fundamentales de derivacin Jerarqua de Herencias. C++ utiliza un sistema de herencia jerrquica. Es decir, se hereda una clase de otra, creando nuevas clases a partir de las clases ya existentes. Slo se pueden heredar clases, no funciones ordinarias n variables, en C++. Una clase derivada hereda todos los miembros dato excepto, miembros datos estticos, de cada una de sus clases base. Una clase derivada hereda las funciones miembro de su clase base. Esto significa que se hereda la capacidad para llamar a funciones miembro de la clase base en los objetos de la clase derivada.
Los siguientes elementos de la clase no se heredan: - Constructores - Destructores - Funciones amigas - Funciones estticas de la clase - Datos estticos de la clase

2
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I - Operador de asignacin sobrecargado Las clases base diseadas con el objetivo principal de ser heredadas por otras se denominan clases abstractas. Normalmente, no se crean instancias a partir de clases abstractas, aunque sea posible. Concepto de herencia simple y mltiple

En C++ existen dos tipos de herencia: simple y mltiple. La herencia simple es aquella en la que cada clase derivada hereda de una nica clase. En herencia simple, cada clase tiene un solo ascendiente. Cada clase puede tener, sin embargo, muchos descendientes. La herencia mltiple es aquella en la cual una clase derivada tiene ms de una clase base. Aunque el concepto de herencia mltiple es muy til, el diseo de clases suele ser ms complejo.

3
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Creacin de una clase derivada (principios genera les de diseo de jerarqua) Cada clase derivada se debe referir a una clase base declarada anteriormente.La declaracin de una clase derivada tiene la siguiente sintaxis: class clase_derivada:<especificadores_de_acceso> clase_base {...}; Los especificadores de acceso pueden ser: public, protected o private.
Clases de derivacin( especificadores de acceso)

Los especificadores de acceso a las clases base definen los posibles tipos de derivacin: public, protected y private. El tipo de acceso a la clase base especfica cmo recibir la clase derivada a los miembros de la clase base. Si no se especifica un acceso a la clase base, C++ supone que su tipo de herencia es privado. - Derivacin pblica (public). Todos los miembros public y protected de la clase base son accesibles en la clase derivada, mientras que los miembros private de la clase base son siempre inaccesibles en la clase derivada. - Derivacin privada (private). Todos los miembros de la clase base se comportan como miembros privados de la clase derivada. Esto significa que los miembros public y protected de la clase base no son accesibles ms que por las funciones miembro de la clase derivada. Los miembros privados de la clase siguen siendo inaccesibles desde la clase derivada. - Derivacin protegida (protected). Todos los miembros public y protected de la clase base se comportan como miembros protected de la clase derivada. Estos miembros no son, pues, accesibles al programa exterior, pero las clases que se deriven a continuacin podrn ac ceder normalmente a estos miembros (datos o funciones). Clase Base Definici n: Las clases base diseadas con el objetivo principal de ser heredadas por otras se denominan clases abstractas. Normalmente, no se crean instancias a partir de clases abstractas, aunque sea posible. Atributo s: La clase base, consta de funciones, parametros, constructores, destructores, 4
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

funciones amigas, funciones estticas, datos estticos de clase, sobrecargas (de funciones y de operadores), etc.
Definicin de una clase derivada

Es una clase que se encuentra declarada despus de la clase base, usando atributos de ella. Se puede definir tambien que la clase derivada es la clase que surge de la clase base o principal. Una clase se puede dividir en subclases. En C++ la clase original se denomina clase base; las clases que se definen a partir de la clase base, compartiendo sus caractersticas y aadiendo otras nuevas, se denominan clases derivadas. Las clases derivadas pueden heredar cdigo y datos de su clase base aadiendo su propio cdigo y datos a la misma. La herencia impone una relacin jerrquica entre clases en la cual una clase hija hereda de su clase padre. Si una clase slo puede recibir caractersticas de otra clase base, la herencia se denomina herencia simple.

5
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Si una clase recibe propiedades de ms de una clase base, la herencia se denomina herencia mltiple Constructores y destructores en herencia Una clase derivada puede tener tanto constructores como destructores, aunque tiene el problema adicional de que la clase base puede tomar ambas funciones miembro especiales. Un constructor o destructor definido en la clase base debe estar coordinado con los encontrados en una clase derivada. Igualmente importante es el movimiento de valores de los miembros de la clase derivada a los miembros que se encuentran en la base. En particular, se debe considerar cmo el constructor de la clase base recibe valores de la clase derivada para crear el objeto completo. Si un constructor se define tanto para la clase base como para la clase derivada, C++ llama primero al constructor base. Despus que el constructor de la base termina sus tareas, C++ ejecuta el constructor derivado. Cuando una clase base define un constructor, ste se debe llamar durante la creacin de cada instancia de una clase derivada, para garantizar la buena inicializacin de los datos miembro que la clase derivada hereda de la clase base. En este caso la clase derivada debe definir a su vez un constructor que llama al constructor de la clase base proporcionndole los argumentos requeridos. Un constructor de una clase derivada debe utilizar un mecanismo de pasar aquellos argumentos requeridos por el correspondiente constructor de la clase base. derivada::derivada(tipo1 x, tipo2 y):base (x,y) {...} Otro aspecto importante que es necesario considerar es el orden en el que el compilador C++ inicializa las clases base de una clase derivada. Cuando El compilador C++ inicializa una instancia de una clase derivada, tiene que inicializar todas las clases base primero. Por definicin, un destructor de clases no toma parmetros. Al contrario que los constructores, una funcin destructor de una clase derivada se ejecuta antes que el destructor de la clase base. Redefinicin de funciones miembro heredadas Se pueden ut ilizar funciones miembro en una clase derivada que tengan el mismo nombre que otra de una clase base. La redefinicin de funciones se realiza mediante funciones miembro sobrecargadas en la clase derivada. Una funcin miembro redefinida oculta toda la funcin miembro heredadas del mismo nombre. Por tanto cuando en la clase base y en la clase derivada hay una funcin con el mismo nombre en las dos, se ejecuta la funcin de la clase derivada. 6
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Herencia mltiple Es la propiedad con la cual una clase derivada puede tener ms de una clase base. Es ms adecuada para definir objetos que son compuestos, por naturaleza, tales como un registro personal, un objeto grfico. Slo es una extensin de la sintaxis de la clase derivada. Introduce una cierta complejidad en el lenguaje y el compilador, pero proporciona grandes beneficios. class ejemplo: private base1, private base2 {...}; La aplicacin de clases base mltiples introduce un conjunto de ambigedades a los programas C++. Una de las ms comunes se da cuando dos clases base tienen funciones con el mismo nombre, y sin embargo, una clase derivada de ambas no tiene ninguna funcin con ese nombre. Cmo acceden los objetos de la clase derivada a la funcin correcta de la clase base? El nombre de la funcin no es suficiente, ya que el compilador no puede deducir cul de las dos funciones es la invocada. Si se tiene una clase C que se deriva de dos clases base A y B, ambas con una funcin mostrar() y se define un objeto de la clase C: C objetoC, la manera de resolver la ambigedad es utilizando el operador de resolucin de mbito: objetoC.A::mostrar(); de objetoC.B::mostrar(); //se refiere a la versin de //mostrar() la clase A //se refiere a la versin de //mostrar() de la clase B

7
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Constructores y destructores en herencia mltiple El uso de funciones constructor y destructor en clases derivadas es ms complejo que en una clase simple. Al crear clases derivadas con una sola clase base, se observa que el constructor de la clase base se llama siempre antes que el constructor de la clase derivada. Adems se dispone de un mecanismo para pasar los valores de los parmetros necesarios al constructor base desde el constructor de la clase derivada. As, la sentencia siguiente pasa el puntero a carcter x y el valor del entero y a la clase base: derivada (char *x, int y, double z): base(x,y) Este mtodo se expande para efectuar ms de una clase base. La sentencia: derivada (char *x,int y, double z): base1(x),base2(y) Llama al constructor base1 y pasa el valor de cadena de caracteres x y al constructor base2 le proporciona un valor entero y. Como con la herencia simple, los constructores de la clase base se llaman antes de que se ejecuten al constructor de la clase derivada. Los constructores se llaman en el orden en que se declaran las clases base. De modo similar, las relaciones entre el destructor de la clase derivada y el destructor de la clase base se mantiene. El destructor derivado se llama antes de que se llame a los destructores de cualquier base. Los destructores de las clases base se llaman en orden inverso al orden en que los objetos base se crearon. Herencia repetida La primera regla de la herencia mltiple es que una clase derivada no puede heredar ms de una vez de una sola clase, al menos no directamente. Sin embargo, es posible que una clase se pueda derivar dos o ms veces por caminos distintos, de modo que se puede repetir una clase. La propiedad de recibir por herencia una misma clase ms de una vez se conoce como herencia repetida. Clase virtuale base

Una clase base virtual es una clase que es compartida por otras clases base con independencia del nmero de veces que esta clase se produce en la jerarqua de derivacin. Suponer, por ejemplo, que la clase T se deriva de las 8
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

clases C y D cada una de las cuales se deriva de la clase A. Esto significa que la clase T tiene dos instancias de A en su jerarqua de derivacin. C++ permite instancias mltiples de la misma clase base. Sin embargo, si slo se desea una instancia de la clase A para la clase T, ent onces se debe declarar A como una clase base virtual. Las clases base virtuales proporcionan un mtodo de anular el mecanismo de herencia mltiple, permitiendo especificar una clase que es una clase base compartida. Una clase derivada puede tener instancias virtuales y no virtuales de la misma clase base

9
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

Ejemplo de Herencia DISEAR UN SISTEMA ORIENTADO A OBJETOS CON HERENCIA PARA EL HOSPITAL DEL ISSSTE TOMANDO EN CONSIDERACION TODOS LOS DATOS NECESARIOS DEL DERECHO-HABIENTE TOMANDO EN COSIDERACION LAS AREAS QUE OFRECE ESTE INSTITUTO DE SERVICIO MEDICO. MI CLASE BASE ES: HOSPITA L MIS CLASES DERIVADAS CONSULTA_GENERAL, ESPECIALIDADES Y HOSPITALIZACION
Consulta General Especialidades Hospitalizacin

Nombre Direccion Sexo trabajador edad dependenc ia edociv

Nombre Direccion Sexo trabajador edad dependencia edociv1 dep-tra


especialidad

Nombre Direccion Sexo trabajador edad dependencia edociv2 area


tratamiento

Leer( )
Imprimir()

Leer( )
Imprimir()

Leer( )
Imprimir()

ARBOL DE HERENCIA

HOSPITAL nom,dir,sexo,edad, dep LEER(),VISUALIZA R()

10
Apuntes del: Ing. Jorge Eloy Toledo Coronel

Programacin I

CONSULTA GENERAL edociv


LEER() VISUALIZAR()

ESPECIALIDADES HOSPITALIZACION edociv1, dep_tra,especialidad edociv2,area,tratamiento,


LEER() VISUALIZAR() LEER() VISUALIZAR( )

11
Apuntes del: Ing. Jorge Eloy Toledo Coronel

#include<iostream.h> #include<conio.h> #include<stdio.h> class hospital {

protected: char nom[100][45],dir[100][45],sexo[100][45],trab[100][3]; int edad[100],i; publi void leer(); c: void visualizar();
char dep[100][3];

};

class consul_general:public hospital { protected: publi void leer(); c: void visualizar();


}; char edociv[100][10];

class especiales:public hospital { protected: publi void leer(); c: void visualizar();


}; char edociv1[100][10],dep_tra[100][45],especialidad[100][45];

class hospitalizacion:public hospital { protected: publi void leer(); c: void visualizar();


}; char area[100][30],tratamiento[100][45],edociv2[100][15];

void hospital::leer() {clrscr(); for (i=1;i<=10;i++) { cout<<"Nombre = "; gets(nom[i]); cout<<"Direccion = "; gets(dir[i]) ; cout<<"Edad = "; cin>>edad[i]; cout<<"Sexo = "; gets(sexo[i]); cout<<"Trabajador = "; gets(trab[i]); cout<<"Dependiente = "; gets(dep[i]); clrscr(); }

} void hospital::visualizar() {clrscr(); for (i=1;i<=10;i++){ cout<<nom[i]; cout<<" "<<dir[i]; cout<<" "<<edad[i]; cout<<" "<<sexo[i]; cout<<" "<<trab[i]; cout<<" "<<dep[i]<<"\n"; getch();

Programacin I

} } void consul_general::leer() {clrscr(); for(i=1;i<=10;i++) { cout<<"Estado Civil = "; gets(edociv[i]); } void consul_general::visualizar() {clrscr(); for(i=1;i<=10;i++) { cout<<edociv[i]< <"\n"; getch(); } } void especiales::leer() {clrscr(); for(i=1;i<=10;i++) { cout<<"Dependencia = "; gets(dep_tra[i]); cout<<"Estado Civil = "; gets(edociv1[i]); cout<<"Especialidad = "; gets(especialidad[i]); } } void especiales::visualizar() {clrscr(); for(i=1;i<=10;i++) { cout<<dep_tra[i]; cout<<" "<<edociv1[i]; cout<<" "<<especialidad[i]<<"\n"; getch(); } void hospitalizacion::leer() {clrscr(); for(i=1;i<=10;i++) { cout<<"Area = "; gets(area[i]); cout<<"Estado Civil = "; gets(edociv2[i]); cout<<"Tratamiento = "; gets(tratamiento[i]); } } void hospitalizacion::visualizar() {clrscr(); for(i=1;i<=10;i++) { cout<<area[i];
} }

Programacin I cout<< " cout<< " getch() ; } } "<<edociv2[i]; "<<tratamiento[i]<<"\n ";

Programacin I //*PROGRAMA PRINCIPAL*// void main() {int op; clrscr(); do{clrscr(); cout<<"Opcion ="; cin>>op; switch(op) { case 1:{ hospital pa ciente; paciente.leer(); paciente.visualizar(); break; } case 2:{ consul_general paciente; paciente.leer(); paciente.visualizar(); break; } case 3:{ especiales paciente; paciente.leer(); paciente.visualizar(); break; } case 4:{ hospitalizaci on paciente; paciente.leer(); paciente.visualizar(); break; } } }

while(op<5);

También podría gustarte