La herencia. Tipo. Subtipo subcategoría. La herencia. Recurso muy importante de los lenguajes P.O.O. Definir una nueva clase:

Documentos relacionados
La herencia. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.

Tema 3. Herencia. Programación Avanzada. Jorge Badenas

Tema 6: Herencia. (El lenguaje C++)

UAA-DSE Programación 2 / C++ Eduardo Serna-Pérez

Programación orientada a objetos. Resumen de Temas Unidad 5: Herencia

PROGRAMACION ORIENTADA A OBJETOS EN C++

La Herencia. La primera línea de cada declaración debe incluir la sintaxis siguiente:

Seminario C++ Introducción a la programación orientada a objetos. Parte IV v Cristina Cachero Pedro J. Ponce de León

Temas. Taller III 2007 Gentile,Vazquez

Tema: Herencia en C#.

CONTENIDOS. La herencia permite: - Adoptar automáticamente características ya implementadas. Ahorro de tiempo y esfuerzo

3. LA HERENCIA. Necesidad de la herencia

2. Tratamiento de objetos con JAVA

HOJA DE EJERCICIOS 3 HERENCIA ENTRE CLASES Y POLIMORFISMO DE MÉTODOS

POO PROGRAMACIÓN ORIENTADA A OBJETOS

Tema: Herencia en C#.

Universidad Nacional del Santa E.A.P. Sistemas e Informática Microcomputación III

ESCUELA DE INGENIERÍA DE SISTEMAS DEPARTAMENTO DE COMPUTACIÓN PROGRAMACIÓN 2 PRÁCTICA DE LABORATORIO 7 Herencia y Composición en POO

Herencia y Polimorfismo en C++

1. Funciones genéricas 2. Clases genéricas

Unidad Didáctica 10. Concepto de Tipo y Subtipo Diseño e Implementación. Versión 1.0.0

Herencia Java y Servicios Web I Master en Ingeniería Matemática

Programación Orientada a Objetos Clases, métodos, atributos. Concepto de herencia, clases derivadas, tipos de herencia.

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

Programación orientada a objetos I

INTRODUCCIÓN A LA POO EN C++

Programación C++(3 Parte) Dr. Oldemar Rodríguez Rojas Maestría en Computación Universidad de Costa Rica

HERENCIA. Problema: Reparar el el coche. Jesús (Valencia) Luis, Mecánico (Valencia) Antonio, Servicio Técnico Ferrari (Madrid)

Guía práctica de estudio 07: Herencia

Cómo se estructura un programa en C#? Qué son las clases y los objetos? Cómo se estructuran los dibujos de AutoCAD?

El patrón Composite (Compuesto) Propósito Componer los objetos a una estructura de jerarquía de relación partetodo.

Academia de computación de IE, ICA e ISISA. Unidad didáctica Programación Orientada a Objetos

Apuntes de Programación y estructuras de datos. Control de datos

Conceptos Básicos de Orientación a Objetos (1era parte)

Introducción a la Programación orientada a objetos con C++

El lenguaje C++ A partir del lenguaje C Entorno de programación Visual C++

Unidad 2. Elementos Intermedios del Lenguaje

Polimorfismo de tipo (en la herencia)

TEMA 5. Agenda. Herencia

Sobrecarga de Operadores II

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Edwin Andrés Cubillos Vega

Examen Teórico Convocatoria de Junio de 2012

INFORMÁTICA INDUSTRIAL

Principios de Computadoras II

HERENCIA Y TIPOS. Articulo. Video Audio Altavoces. Amplificador

Tema 5. Herencia. Departamento de Lenguajes y Sistemas Informáticos Universidad de Granada

UNIDAD 4 IMPLEMENTACION DE PROPIEDADES DE LOS OBJETOS JAVA

INTRODUCCIÓN A LA PROGRAMACIÓN

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

Herencia. Implementación en Java

Curso de Java POO: Programación orientada a objetos

Prof. Dr. Paul Bustamante

Tema: Funciones Virtuales y Polimorfismo.

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

Herencia. Proceso mediante el cual una clase adquiere las propiedades (atributos) y comportamiento (métodos) de otra.

Objetos y memoria dinámica

TEMA 3. DEFINICIÓN Y USO DE MÉTODOS POLIMORFOS

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones

Tema 2: Programación basada en Objetos

Introducción a la Programación Orientada a Objetos (POO)

Tema 3 Herencia en Java Parte 1. Programación Orientada a Objetos Curso 2015/2016

Curso de Java POO: Programación orientada a objetos

B.- Ejercicio de Herencia y Polimorfismo: FORMAS

Clases y Objetos en C++

Examen Junio- Grupo B Lunes 17 de Junio - Programación en C++ Pág. 1

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Prof. Dr. Paul Bustamante

PARTE TEÓRICA - TEST [2,5 PUNTOS]:

CURSO 2º GRUPO Junio 2011

Compiladores e Intérpretes Análisis Semántico IV

Curso de PHP. Pascual Gómez del Pino Página 1

La Herencia: Teoría (1)

Implementación de las Clases Pila, Cola, Lista y Arbol

INICIACIÓN A LA PROGRAMACIÓN LENGUAJE JAVA con BlueJ

Tema 3 Herencia en Java Parte 2. Programación Orientada a Objetos Curso 2015/2016

Derechos de Acceso: COMPOSICION

PUBLICACIÓN DEL ENUNCIADO: Semana del 10 de noviembre de ENTREGA: Clase de laboratorio de la semana del 8 de diciembre de 2003.

Introducción. el tema de lo que se. función. especifico de la. redefine en una. misma con. #include<conio.h> public: int i; base ( int.

Programación de Computadores 7 Objetos y Clases. Prof. Javier Cañas R. Universidad Técnica Federico Santa María Departamento de Informática.

Programación Orientada a Objetos en C#.NET CAPÍTULO 7 POLIMORFISMO. Ing. Bruno López Takeyas, M.C.

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

POO: Herencia. Programación de aplicaciones. Jesus Barron Vidales 7/05/10

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

Programación Orientada a Objetos. Resumen de Temas Unidad 3: Constructores y destructores

Prueba N o 1. Programación II

Tema: Plantillas en C++.

Sebastián García Galán

Tema 6. Gestión dinámica de memoria

Informática Industrial I

Laboratorio 6 Tema 8. Programación Orientada a Objetos

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

Definición. Mónica E. García García Feb 07

Módulo 8: INTERFACES

Transcripción:

La herencia La herencia Recurso muy importante de los lenguajes P.O.O. Definir una nueva clase: como extensión de otra previamente definida. sin modificar la ya existente. La nueva clase hereda de la clase anterior: las variables. las operaciones. Principal objetivo/ventaja: Reutilización del código. Ahorro de esfuerzo. Mayor confianza en el código. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 51 La herencia en el mundo real. Tipo Categoría Subtipo subcategoría La herencia. Tipos y subtipos El conjunto de elementos que pertenecen a un tipo incluye a los elementos que pertenezcan a sus subtipos. Animales Mamíferos Aves Mamíferos Animales Aves Gatos Leones Palomas Águilas Conjuntos anidados de objetos. Relación entre tipos y subtipos. Gatos Leones Águilas Palomas Edificios Motocicletas Organización jerárquica de categorías. Relación es-un. Relación supertipo-subtipo. Conjuntos disjuntos. No hay relación de subtipado entre estos tipos. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 52 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 53

La herencia. Tipos y subtipos. Principio de subtipos: Un objeto de un subtipo puede aparecer en cualquier lugar donde se espera que aparezca un objeto del supertipo. Los animales son capaces de moverse por sí mismos. Los mamíferos son capaces de moverse por sí mismos. Las aves son capaces de moverse por sí mismas. Los gatos son capaces de moverse por sí mismos. A la inversa no es cierto. Los gatos maullan. Los mamíferos maullan. Los animales maullan. La herencia en la P.O.O. Clase base superclase, padre de producción Clase derivada subclase, hija de producción comercial comerciales Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 54 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 55 La herencia en la P.O.O. El principio de los subtipos también se cumple en la P.O.O. Una función que recibe un objeto de la clase base. void Despedir ( empleado); Puede recibir objetos de la clase base y también de sus derivadas. empleado e; empleado_producción ep; empleado_comerciales ec; Despedir (e); Despedir (ep); Despedir (ec); Clase empleado producción Num_Piezas Pts_Pieza Calcular_Sueldo(); Herencia de métodos y variables. Clase empleado Nombre DNI Sueldo fijo Cambiar_Sueldo(); Clase empleado comercial Pts_vendidas Calcular_Sueldo(); Las clases derivadas reciben las variables y métodos de la clase base. _comercial ec; _produccion ep; ec.cambiar_sueldo(); ep.cambiar_sueldo(); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 56 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 57

Composición: Composición y herencia Relación tener-un Un coche tiene un tipo de motor Composición significa contener un objeto. Herencia: Coche class coche... private: Motor _motor; Motor Relación ser-un Un coche es un vehículo Herencia significa contener una clase. Coches Vehículos Autobuses class coche: vehiculo Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 58 Ejemplos de composición y herencia Clase persona y clase empleado. Herencia: un empleado es una persona. Clase persona y clase domicilio. Composición: una persona tiene un domicilio. Clase lista y clase nodo de la lista: Composición: una lista tiene un puntero de tipo nodo al nodo que está en cabeza de la lista (tener-un). Clase empresa, clase empleado y clase jefe de grupo de empleados. Herencia entre empleado y jefe: Un jefe es un empleado. Composición entre empresa y empleado o jefe. Una empresa puede tener una lista de empleados y otra de jefes. Por el principio de los subtipos, una empresa puede tener una única lista donde aparezcan tanto jefes como empleados. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 59 class empleado_produccion: public empleado int num_piezas; int ptas_pieza; de Producción Comercial long int CalcularSueldo(void); class empleado char nombre[30]; char DNI[9]; long int sueldo; void CambiarSueldo(long int v); long int SueldoBase(void) return sueldo; class empleado_comercial: public empleado int ptas_vendidas; long int CalcularSueldo(void); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 60 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 61

long int empleado_produccion::calcularsueldo(void) return( SueldoBase() + num_piezas * ptas_pieza ); Los miembros de la clase empleado se pueden utilizar en las clases derivadas tal y como si hubiesen sido definidos en éstas Método de la clase base empleado::cambiarsueldo() Equivale a: empleado::sueldobase() empleado_produccion ep; ep.cambiarsueldo(100000); cout << El sueldo es << ep.calcularsueldo(); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 62 Modos de acceso private Lo que es private en la clase base no es accesible en la clase derivada. public Lo que definimos como public es accesible desde cualquier parte. protected Lo que definimos como protected en la clase base: es accesible en la clases derivadas, pero no es accesible desde fuera de las clases derivadas o base. Clase derivada public protected private Accesible Accesible No Accesible Fuera Accesible No Accesible No Accesible Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 63 Tipos de herencia class <clase_derivada>:<tipo> <clase_base> los modos de acceso a los miembros de la clase base se quedan igual en la clase derivada. protected: Los miembros public de la clase base pasan a ser protected. El resto se queda igual. private: Todos los miembros de la clase base pasan a ser private en la derivada. class padre int x; void Sx(int v) x=v; class hija: protected padre int h; void SetX(int v) // x=v; no permitido Sx(v); hija h; // h.sx(5); // no permitido h.setx(5); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 64 Redefinición de miembros A veces, interesa cambiar en la subclase la definición de algo que está en la clase base. protected: int v; void Sv(int val) v=val; char v[30]; // re-definición v void Sv(int val) // re-definición Sv() itoa(val,10,v); Lo redefinido no desaparece. derivada d; d.base::sv(5); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 65

Ejemplo re-definición de métodos class empleado char nombre[30]; int ptas_hora; int num_horas; void AsignarNombre(char *nom)... void AsignarHorasPtas(int ptas, int horas)... int Sueldo(void) return ( ptas_hora * num_horas ); class empleado_comercial: public empleado int ptas_km; int num_km; Comercial void DietasPtas(int ptas,int km)... int Sueldo(void) return ( empleado::sueldo() + ptas_km * num_km ); Sino, sería una llamada recursiva a empleado_comercial::sueldo() Herencia múltiple Una clase derivada hereda las características de más de una clase base. MATERIAL ELÉCTRICO COCHE ELÉCTRICO autonomía tensión potencia ACUMULADOR ELÉCTRICO capacidad_carga Herencia múltiple COCHE GASOLINA número_bujías MEDIO DE TRANSPORTE velocidad_limite precio COCHE número de puertas color COCHE DIESEL tipo_inyector Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 66 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 67 Herencia múltiple en C++ class empleado...... int Sueldo(void); class comercial int ptas_km; int num_km;... int Sueldo(void) return (ptas_km * num_km); Constructores y destructores en la herencia: Construcción objeto clase derivada: Primero se construye la parte heredada de la clase(s) base. Se ejecutan constructores de las clases base. Por último se ejecuta el código del constructor de la clase derivada. Herencia múltiple class empleado_comercial: public empleado, public comercial int Sueldo(void) return ( empleado::sueldo() + comercial::sueldo() ); Destrucción objeto clase derivada: el proceso es a la inversa que en la construcción. Se ejecuta primero el destructor de la clase derivada, y a continuación los de las clases base. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 68 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 69

Ejemplo (Constructores y destructores en la herencia): 1 base1(void) cout << base1 ; base1(void) cout << base1 D ; 2 base2(void) cout << base2 ; base2(void) cout << base2 D ; 1, public base2 derivada(void) cout << derivada ; derivada(void) cout<< derivada D ; derivada d; base1 base2 derivada derivada D base2 D base1 D Constructores y destructores en clases compuestas y derivadas: base(void) cout << base ; base(void) cout << base D ; class miembro miembro(void) cout << miembro ; miembro(void) cout << miembro D ; miembro m; derivada(void) cout << derivada ; derivada(void) cout<< derivada D ; derivada d; base miembro derivada derivada D miembro D base D Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 70 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 71 Llamadas a los constructores de las clases base: base(void) cout << base(void) ; base(int a) cout << base(int) ; derivada(void) cout << derivada(void) ; derivada(int v): base(v) cout << derivada(int) ; derivada d1; derivada d2=5; Llamada al constructor base base(void) derivada(void) El constructor copia en la herencia: base(void) cout << base(void) ; base(base &b) cout << base(abase &) ; derivada(void) cout << derivada(void) ; derivada d1; derivada d2=d1; base(void) derivada(void) base(base &) base(int) derivada(int) Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 72 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 73

Si definimos constructor copia en la clase derivada: base(void) cout << base(void) ; base(base &b) cout << base(abase &) ; derivada(void) cout << derivada(void) ; derivada(derivada &d) cout << derivada(derivada &) ; derivada d1; derivada d2=d1; base(void) derivada(void) base(void) derivada(derivada &) Ejemplo de subtipado y constructor copia en herencia: class entero int v; entero(int val=0) v=val; void Sv(int val) v=val; int Gv(void) return v; class entero_cad : public entero char *cad; entero_cad(int val=0): entero(val) char aux[30]; itoa(val,10,aux); cad=new char[strlen(aux)+1]; strcpy(cad,aux); entero_cad(entero_cad &e); Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 74 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 75 // constructor copia entero_cad :: entero_cad(entero_cad &e) : entero(e) char aux[30]; itoa(e.v,10,aux); cad=new char[strlen(aux)+1]; strcpy(cad,aux); void f1(entero_cad c) cout << valor << c.gv(); void f2(entero t) cout << valor << t.gv(); cout << suma << t.gv()+50; Llamada al constructor copia. En este caso, al que hay definido por defecto en la clase entero. Clase base virtual Clase ABUELA Clase MADRE 1 Clase MADRE 2 Hay que definirla como una clase base virtual para que... Clase MADRE 3 entero_cad e=8; entero(e) entero_cad(e) Clase HIJA f1(e); f2(e); entero(e)... la clase HIJA NO herede por triplicado los miembros de la ABUELA. Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 76 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 77

Herencia virtual Herencia virtual incr_c incr_disp_c contador Herencia virtual disp_c class contador //clase base virtual protected: int cont; contador(int c=0) cont=c; void Reset(int c=0) cont=c; class incr_c: virtual public contador incr_c(): contador(100) void Increment() cont++; Si una clase base virtual define constructores, debe proporcionar: un constructor sin parámetros o un constructor que admita valores por defecto para todos los parámetros. Las clases derivadas de una clase base virtual tienen que: ser definidas como herencia virtual. class disp_c: virtual public contador disp_c(): contador(200) void mostrar() cout << cont; class incr_disp_c: public incr_c, public disp_c incr_disp_c(): contador(300) Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 78 Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 79 Punteros a clases derivadas class A protected: int v; void Sv(int x) v=x; int Gv(void) return v; class B: public A B(void) v=0; void Sv(int x) v+=x; B vb[10]; A *pa; for(int i=0; pa=vb; i<10; i++, pa++) int a; cin >> a; cout << pa->gv(); //de la clase A pa->sv(a); //se ejecuta A::Sv(), aunque //el objeto sea de la clase B Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas. 80