1 / 59

Informática II

Informática II. Clase 9: Polimorfismo. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Contenido. Repaso. 1. Polimorfismo. 2. Herencia múltiple. 3. Herencia Virtual. 4. Tipos de datos abstractos. 3. Definición. Definición:

Download Presentation

Informática II

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Informática II Clase 9: Polimorfismo Diego Fernando Serna Restrepo Semestre 2011/2

  2. Chiste del Día Informática II 2011/2

  3. Contenido Repaso 1 Polimorfismo 2 Herencia múltiple 3 Herencia Virtual 4 Tipos de datos abstractos 3 Informática II 2011/2

  4. Definición Definición: • Un array es una colección de variables del mismo tipo de datos con un mismo nombre. • Los arrays son un ejemplo de una variable estructurada en la cual: • Hay un numero de piezas de datos contenidos en el mismo nombre. • Hay un método ordenado para la extracción de datos individuales del array

  5. INICIALIZACIÓN Inicialización de Arreglos En el momento de declarar el arreglo, se puede inicializar int edad[10]={16,22,19,21,21,18,19,15,32,28}; Se crea el arreglo y se inicializa 16 22 19 21 21 18 19 15 32 28 floattemp[4]={21.3, 23.5, 27.5, 26.4}; Se crea el arreglo y se inicializa 23.5 27.5 26.4 21.3

  6. Arreglos de Objetos • Los arreglos pueden guardar secuencias de datos de cualquier tipo, incluyendo los objetos. • Si se desea usar un método de un objeto en un arreglo se usa el operador punto (.), tal como se hace con los objetos. Carro carrosBacanos[2]; // ¡Debe existir un constructor // por defecto que inicialice cada uno de los objetos! carrosBacanos[0].acelerar(); Informática II 2009/2

  7. ArreglosMultidimensionales • Es posible crear arrays de tantas dimensiones como requieran sus aplicaciones. • Se declaran siguiendo el patrón de la declaración de un vector: tipo nombre [d1] [d2] [d3]… [dN];

  8. Arreglos de 2 Dimensiones • Declaración • Ejemplo: tipo nombre [fila] [columna]; intA[2] [3]; Nombre A[0][0] A[0][1] A[0][2] Filas = 2 A[1][0] A[1][1] A[1][2] Columnas = 3

  9. Arreglos de 2 Dimensiones A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2] A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]

  10. InicializaciónArreglosMultidimensionales Fila 0 Fila 1 intmatrizA [2] [3] = { {3,5,7} , {8,6,4} }; A[0][0] A[0][1] A[0][2] 3 5 7 A[1][1] A[1][2] A[1][0] 8 6 4 intmatrizA [2] [3] = { {3,5,7} , {8,6,4} }; intmatrizA [2] [3] = { 3,5,7,8,6,4 };

  11. Arreglos de 3 Dimensiones tipo nombre [fila] [columna] [Planos]; • Declaración IntmatrizB[2] [3] [3]; B[0][1][2] B[0][2][2] B[0][0][2] Planos = 3 B[0][1][1] B[0][2][1] B[0][0][1] B[1][2][2] B[1][0][1] B[1][1][1] Nombre B[0][1][0] B[0][2][0] B[0][0][0] B[1][2][1] B[1][0][1] B[1][1][1] Filas = 2 B[1][0][0] B[1][1][0] B[1][2][0] Columnas = 3

  12. Arreglos de 3 Dimensiones Fila 0 Fila 1 Bloque 0 • intmatrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, • {{2,4,6}, {8,10,12}}, • {{3,7,11}, {15,19,23}} }; Bloque 1 Bloque 2 Bloque 0 Bloque 1 Bloque 2 F0 1 3 5 2 4 6 3 7 11 F1 7 9 11 8 12 15 19 23 10 C0 C1 C2 C0 C0 C1 C2 C1 C2

  13. Uso del Heap problemas de memoria Cuando se declara un arreglo, se separa un espacio en memoria fijo para almacenarlo. El arreglo se localiza en el stack (limitado). Heap. Tiene más memoria. Es posible crear estructuras que se comportan de manera dinamica

  14. Arreglos en el heap Arreglo de apuntadores. Diferencia entre apuntador a un arreglo y arreglo de apuntadores 1: CAT FamilyOne[500]; 2: CAT * FamilyTwo[500]; 3: CAT * FamilyThree = new CAT[500]; (3) es una variante de (1), muy distinta de (2). Uso del Heap problemas de memoria

  15. Ejemplo • Oveja rebanoUno[100]; //Arreglo de 100 ovejas en la pila • Oveja * rebanoDos[100]; //Arreglo de 100 punteros a ovejas • Oveja * rebanoTres = new Oveja[100]; //Puntero a arreglo de 100 ovejas en el //heap, rebanoTres apunta al primer //objeto tipo oveja ubicado en el heap Informática II 2011/2

  16. Uso de apuntadores con nombres de arreglos Los arreglos son apuntadores constantes. CAT Family[50]; Es un apuntador constante a &Family[0]; Es legal usar nombres de arreglos como apuntadores constantes y viceverza. Family[4]; Family + 4; Uso del Heap problemas de memoria • Arreglos en el Free Store delete [] Family;

  17. Otorgando tamaño de los arreglos en tiempo de ejecución • Cuando se utilizan arreglos que se encuentren ubicados en el heap, será posible asignar su tamaño en tiempo de ejecución, otorgándole gran posibilidad de intercambio a los programas. Gato pGato = new Gato [vble]; /* ¡Importante!, recuerde liberar la memoria cuando ya no se vaya a usar */ Informática II 2009/2

  18. Clase string La clase string está definida en la cabecera string (#include <string>) ≠ <cstring.h> <string> <string.h> que contiene solo las funciones para trabajar con strings terminados en NULL - por ejemplo para trabajar con char cadena[45]) La cual no contiene la definición de la clase string Si se incluye el módulo <iostream> no hace falta incluir <string>, porque la segunda está incluida en la primera. Incluir las dos no provoca error y mejora la legibilidad. Informática II 2011/2

  19. Ejemplo clase string #include <iostream> #include <string> usingnamespacestd; carro audi; intmain() { string s1; s1 = "http://"; string s2 = "microe.udea.edu.co"; string s3(“/~diegoserna "); string s4(1, char(32)); string s5(2, &#39;\n&#39;); string s6 (s3, 2, 10); string s7 (“informatica 2"); stringmsg = s1+s2+s3+s5+s6+s4+s7; return 0; } http://microe.udea.edu.co/~diegoserna diegosernainformatica 2 Informática II 2011/2

  20. Listas enlazadas • Aunque los arreglos son excelentes contenedores y pueden albergar cualquier tipo de datos, tienen el inconveniente de ser de tamaño fijo. • Este problema puede arreglarse reasignando su tamaño dinámicamente en tiempo de ejecución; sin embargo, cuando haya que mover, liberar o reasignar memoria muchas veces, puede requerir muchos recursos del pc. Informática II 2009/2

  21. Listas enlazadas • Las listas enlazadas son estructuras de datos que contienen pequeños contenedores diseñados para enlazarse unos a otros. • La idea de esta estructura, es que cada uno de los objetos conoce la ubicación del siguiente objeto en la cadena. Informática II 2009/2

  22. Listas enlazadas • Cada contenedor de la lista se denomina “nodo”. • Al primer nodo de la lista se le denomina la “cabeza” de la lista, al último la “cola”. • Existen tres tipos fundamentales de listas: – Enlazados de manera sencilla – Doblemente enlazadas – Arboles Informática II 2009/2

  23. Listas enlazadas de manera sencilla • Cada nodo apunta al siguiente en la lista, nunca en el sentido contrario. Si se desea conocer el valor de un nodo particular, es necesario recorrer toda la lista nodo por nodo desde su inicio. Informática II 2009/2

  24. Listas doblemente enlazadas • Son aquellas que permiten moverse tanto hacia el siguiente nodo como al anterior, pues en cada uno de ellos guarda dicha información. Informática II 2009/2

  25. Listas en árbol • Permiten que cada nodo apunte a dos o más nodos. Informática II 2009/2

  26. Resumen Informática II 2009/2

  27. Resumen Informática II 2009/2

  28. Contenido Repaso 1 Polimorfismo 2 Herencia múltiple 3 Herencia Virtual 4 Tipos de datos abstractos 3 Informática II 2011/2

  29. Polimorfismo tipos polimórficos, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado. Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases Relacionar un objeto de una clase derivada con un puntero de clase base en tiempo de ejecución. Reescribir funciones Virtuales en las clases derivadas Informática II 2011/2

  30. Polimorfismo • Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases. • Por ejemplo: ¿Que pasa si se tienen dos clases, clase Caballo y clase Pajaro, y se desea crear una nueva clase que tome lo mejor de cada uno de ellos para formar un pegaso?. Informática II 2009/2

  31. Accediendo a los elementos • Existen dos maneras de resolver este dilema usando la herencia simple: • Usando filtración ascendente • Usando conversión descendente Informática II 2009/2

  32. Filtración ascendente • Consiste en implementar todas las funciones desde la clase base, y reescribirlas en cada clase derivada para que trabaje adecuadamente. • Tiene el problema de llenar la clase base de funciones y miembros que no le serán útiles, atentando con su simplicidad. Informática II 2009/2

  33. Conversión descendente • Consiste en implementar los métodos necesarios en las clases derivadas y solo llamarlas si el apuntador realmente apunta a hacia un espacio de memoria asignado para su clase derivada. • Se implementa utilizando el RTTI (Identificación de Tipo en Tiempo de Ejecución), no todos los compiladores lo tienen implementado. Informática II 2009/2

  34. Conversión descendente • En C++ es posible hacer casting para convertir un puntero que apunta a una clase base para convertirlo a un puntero que apunte a su clase derivada, se hace usando el operador “dinamic_cast”. • Si este no puede realizar la conversión devuelve un valor nulo. ClaseDerivada *pClaseBase = dinamic_cast<ClaseDerivada *> (pClaseBase) Informática II 2009/2

  35. Conversión descendente • Sin embargo hacer una conversión explícita de un puntero tipo ClaseBase a un puntero tipo ClaseDerivada para verificar si tiene o no cierta capacidad o miembro, es un indicio de que algo no fue diseñado adecuadamente. Informática II 2009/2

  36. Polimorfismo • Aunque ambas soluciones pueden resolver parcialmente dicho dilema, solo será posible ubicar a la clase derivada debajo de la línea de una sola clase, por lo tanto en el caso que la segunda clase base cambie, no habría forma de relacionarlos. Informática II 2009/2

  37. Problema de las 2 soluciones • Aunque ambas soluciones pueden resolver parcialmente dicho dilema, solo será posible ubicar a la clase derivada debajo de la línea de una sola clase, por lo tanto en el caso que la segunda clase base cambie, no habría forma de relacionarlos. Informática II 2009/2

  38. Contenido Repaso 1 Polimorfismo 2 Herencia múltiple 3 Herencia Virtual 4 Tipos de datos abstractos 3 Informática II 2011/2

  39. Herencia Múltiple • Es posible crear una nueva clase a partir de más de una clase base. Esto es llamado herencia múltiple . class Derivada: public Base1, public Base2...{ ….. } class Pegaso: public Caballo, publicPajaro{ ….. } Pegaso Pájaro Caballo Cuando una clase derivada hereda de múltiples clases bases, el compilador asignará la memoria suficiente para alojar sus características y las de sus clases base. Informática II 2011/2

  40. Constructores en la herencia múltiple • En la etapa de inicialización de los constructores de la clase derivada , será posible declarar los constructores de la clase base que deberán ser llamados. • ¿Que pasa si una clase derivada de varias clases base, hereda un método que tiene la misma firma en todas ellas? Informática II 2011/2

  41. Constructores en la herencia múltiple • Si se trata de llamar un método heredado de varias clases cuya firma sea igual, el compilador lanzará un error de compilación. • Existen dos alternativas para instanciar dichos métodos: • Accediendo explícitamente al método de la clase base que se desea. • Redefiniendo el método en la función derivada Informática II 2011/2

  42. Herencia de una clase base común • Para que el compilador pueda compilar de manera adecuada, se deberá introducir explícitamente de cual clase base se tomarán dichos parámetros. • Ambigüedad: Intage = pPeg->GetAge(); • Solución: Intage = pPeg->Horse:: GetAge(); O redeclararla en la clase derivada: virtual intGetAge()const { return Horse::itsAge; } Informática II 2011/2

  43. Herencia de una clase base común • Cuando se hereda de clases que vengan de la misma línea de herencia, también existe el riesgo de caer en otro tipo de ambigüedad. • ¿De cual clase superior común debe heredar una clase derivada? Caballo Pájaro Pegaso Animal Animal Informática II 2011/2

  44. Herencia de una clase base común • class Horse : virtual public Animal • class Bird : virtual public Animal • class Pegasus : public Horse, public Bird Las clases bases heredadas virtualmente (animal) son inicializadas por sus clases derivadas que se encuentran más abajo en la jerarquía (pegasus). Por ejemplo la clase base Animal no es inicializada por Horse o Bird sino por Pegasus. Horse y Bird tendrán que inicializar Animal en sus constructores, pero estas inicializaciones serán ignoradas cuando un objeto Pegasus sea creado. Informática II 2011/2

  45. Contenido Repaso 1 Polimorfismo 2 Herencia múltiple 3 Herencia Virtual 4 Tipos de datos abstractos 3 Informática II 2011/2

  46. Herencia virtual • Habrán ocasiones donde no se desee que una clase derivada tenga dos copias de la misma clase base compartida. • En C++ esto será posible declarando a la clase base como virtual. Caballo Pájaro Pegaso Animal Informática II 2011/2

  47. Problemas con la herencia múltiple • A pesar de que la herencia múltiple ofrece múltiples ventajas sobre la herencia simple, muchos desarrolladores son reacios a utilizarla, pues dicen que correr un debuger en estos sistemas es mucho mas complicado que en la herencia simple. Informática II 2011/2

  48. Tips con la herencia múltiple Informática II 2011/2

  49. Mezclas y clases de capacidad • Las mezclas es una solución intermedia de la herencia múltiple y la herencia sencilla. • Una clase de mezcla o capacidad, es una clase que adiciona funcionalidad sin agregar mayor o ningún dato adicional. Informática II 2011/2

  50. Tipos de datos abstractos (TDA) • Un tipo de dato abstracto (abstract data type ADT) representa un concepto general, por lo tanto no es válido hacer una instancia de un ADT. • Por ejemplo si se crea un dato abstracto llamado “figura geométrica” no tendría sentido crear un objeto de dicha clase por ser muy general, pero esta serviría como modelo o bosquejo para crear nuevas clases más especificas como “circulo” o “cuadrado”. Informática II 2011/2

More Related