Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Polimorfismo2015c1

166 vues

Publié le

polimorfismo y herencia en c++

Publié dans : Ingénierie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Polimorfismo2015c1

  1. 1. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo Programaci´on Avanzada 30 de marzo de 2015
  2. 2. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Contenido Introducci´on Definici´on de Polimorfismo Polimorfismo en C++ Ejemplo de jugete Herencia Upcasting Funciones virtuales Clases abstractas Tabla de m´etodos virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores Downcasting Polimorfismo y contenedoras
  3. 3. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo ¿Qu´e es el Polimorfismo? • Permite escribir programas de manera general, manipulando clases existentes y otras a´un por especificar
  4. 4. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo ¿Qu´e es el Polimorfismo? • Permite escribir programas de manera general, manipulando clases existentes y otras a´un por especificar • Otras definiciones:
  5. 5. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo ¿Qu´e es el Polimorfismo? • Permite escribir programas de manera general, manipulando clases existentes y otras a´un por especificar • Otras definiciones: • Dos o m´as objetos de una misma clase se comportan de formas diferentes.
  6. 6. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo ¿Qu´e es el Polimorfismo? • Permite escribir programas de manera general, manipulando clases existentes y otras a´un por especificar • Otras definiciones: • Dos o m´as objetos de una misma clase se comportan de formas diferentes. • Una variable puede tomar diferentes tipos, dependiendo de la necesidad en tiempo de ejecuci´on.
  7. 7. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo ¿Qu´e es el Polimorfismo? • Permite escribir programas de manera general, manipulando clases existentes y otras a´un por especificar • Otras definiciones: • Dos o m´as objetos de una misma clase se comportan de formas diferentes. • Una variable puede tomar diferentes tipos, dependiendo de la necesidad en tiempo de ejecuci´on. • Un puntero a un objeto de la superclase puede ser instanciado como cualquiera de sus clases descendientes.
  8. 8. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario:
  9. 9. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario: • Herencia.
  10. 10. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario: • Herencia. • Funciones virtuales.
  11. 11. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario: • Herencia. • Funciones virtuales. • Objetos din´amicos.
  12. 12. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Ejemplo de jugete Modelado de una Orquesta
  13. 13. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Ejemplo de jugete Modelado de una Orquesta Se desea modelar Orquesta en la cual el usuario del programa tenga el control de crear varios tipos de instrumentos y cuantos desee. Adem´as, el usuario puede elegir que puedan afinarse o bien ejecutar determinado conjunto de notas.
  14. 14. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo.
  15. 15. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres).
  16. 16. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias.
  17. 17. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias. • ¿Qu´e se hereda de la clase base?
  18. 18. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias. • ¿Qu´e se hereda de la clase base? • En principio, todo. Excepto:
  19. 19. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias. • ¿Qu´e se hereda de la clase base? • En principio, todo. Excepto: • El constructor y destructor de la clase base.
  20. 20. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias. • ¿Qu´e se hereda de la clase base? • En principio, todo. Excepto: • El constructor y destructor de la clase base. • El operador = de la clase base.
  21. 21. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo. • Permite crear clases (derivadas o hijas) a partir de otras clases (bases o madres). Estas nuevas clases incluyen las caracter´ısticas de la clase ancestra m´as las propias. • ¿Qu´e se hereda de la clase base? • En principio, todo. Excepto: • El constructor y destructor de la clase base. • El operador = de la clase base. • Las funciones y clases amigas de la clase base.
  22. 22. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Ejemplo de jugete
  23. 23. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Ejemplo de jugete • Se tienen instrumentos de los cuales se requiere que ejecuten notas.
  24. 24. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Ejemplo de jugete • Se tienen instrumentos de los cuales se requiere que ejecuten notas. • Supongamos, un Violin.
  25. 25. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Sintaxis 1 class nombre_clase_derivada: public nombre_clase_base { /*...*/ };
  26. 26. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Sintaxis 1 class nombre_clase_derivada: public nombre_clase_base { /*...*/ }; 2 // Ejemplo: 3 class Violin: public Instrumento { /* ... */};
  27. 27. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 };
  28. 28. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 };
  29. 29. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 };
  30. 30. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 }
  31. 31. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 } 20 int main(){ 21 Violin v;
  32. 32. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting 1 class Instrumento { 2 public: 3 void ejecutar() {cout << "Inst::ejecutar";}; 4 string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 } 20 int main(){ 21 Violin v; 22 afinar(v); // Upcasting 23 return(0); 24 }
  33. 33. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo.
  34. 34. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar.
  35. 35. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar. • ¿Por qu´e sucede esto?
  36. 36. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar. • ¿Por qu´e sucede esto? • Encadenamiento temprano.
  37. 37. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar. • ¿Por qu´e sucede esto? • Encadenamiento temprano. • Encadenamiento tard´ıo:
  38. 38. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar. • ¿Por qu´e sucede esto? • Encadenamiento temprano. • Encadenamiento tard´ıo: Funciones virtuales.
  39. 39. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Con el upcasting le puedo asignar a un puntero de la clase base, un puntero o direcci´on de un objeto hijo. • Sin embargo, la funci´on afinar de la clase Instrumento muestra: Inst::ejecutar. • ¿Por qu´e sucede esto? • Encadenamiento temprano. • Encadenamiento tard´ıo: Funciones virtuales. • Cuando se utiliza upcasting se debe tener en cuenta que s´olo es posible invocar a los m´etodos definidos en la clase madre.
  40. 40. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar:
  41. 41. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar();
  42. 42. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar(); 8 9 cout <<"Caso contra Mixton"; 10 Violin *pv; 11 pv = &i; 12 pv->ejecutar(); 13 return 0;}
  43. 43. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar(); 8 9 cout <<"Caso contra Mixton"; 10 Violin *pv; 11 pv = &i; 12 pv->ejecutar(); 13 return 0;} • Salida Caso Mixto
  44. 44. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar(); 8 9 cout <<"Caso contra Mixton"; 10 Violin *pv; 11 pv = &i; 12 pv->ejecutar(); 13 return 0;} • Salida Caso Mixto Instrumento::ejecutar
  45. 45. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar(); 8 9 cout <<"Caso contra Mixton"; 10 Violin *pv; 11 pv = &i; 12 pv->ejecutar(); 13 return 0;} • Salida Caso Mixto Instrumento::ejecutar • Salida Caso contra Mixto
  46. 46. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar: 1 int main() 2 { 3 Instrumento i; Violin v; 4 cout <<"Caso Mixton"; 5 Instrumento *pi; 6 pi=&v; 7 pi->ejecutar(); 8 9 cout <<"Caso contra Mixton"; 10 Violin *pv; 11 pv = &i; 12 pv->ejecutar(); 13 return 0;} • Salida Caso Mixto Instrumento::ejecutar • Salida Caso contra Mixto ERROR: NO PUEDE REALIZARSE LA CONVERSI ´ON
  47. 47. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Son m´etodos miembros que est´an definidos en la clase base, y se redefinir´an en las clases descendientes
  48. 48. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Son m´etodos miembros que est´an definidos en la clase base, y se redefinir´an en las clases descendientes • Si un m´etodo miembro se define como virtual en alguna de las clases de una jerarqu´ıa, autom´aticamente pasa a ser virtual en todas las clases de dicha jerarqu´ıa.
  49. 49. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Son m´etodos miembros que est´an definidos en la clase base, y se redefinir´an en las clases descendientes • Si un m´etodo miembro se define como virtual en alguna de las clases de una jerarqu´ıa, autom´aticamente pasa a ser virtual en todas las clases de dicha jerarqu´ıa. • En el ejemplo planteado, notar que es posible independizarse del instrumento en colaborar de responsabilidades. En esta caso, ejecutar notas.
  50. 50. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 };
  51. 51. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 };
  52. 52. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 };
  53. 53. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 // ... 20 }
  54. 54. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 // ... 20 } 21 int main(){ 22 Violin v;
  55. 55. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales 1 class Instrumento { 2 public: 3 virtual void ejecutar() {cout << "Inst::ejecutar";}; 4 virtual string nombre() {return "Instrumento";}; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";}; 14 string nombre() {return "Violin";} ; 15 }; 16 void afinar(Instrumento& i) { 17 // ... 18 i.ejecutar(); 19 // ... 20 } 21 int main(){ 22 Violin v; 23 afinar(v); // Upcasting 24 return(0); 25 }
  56. 56. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on:
  57. 57. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar();
  58. 58. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar();
  59. 59. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin:
  60. 60. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin: Violin::ejecutar
  61. 61. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin: Violin::ejecutar • Salida Caso del Instrumento:
  62. 62. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin: Violin::ejecutar • Salida Caso del Instrumento: Instrumento::ejecutar
  63. 63. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin: Violin::ejecutar • Salida Caso del Instrumento: Instrumento::ejecutar • Salida Caso Mixto:
  64. 64. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on: 1 int main(){ 2 cout << "Caso Violinn"; 3 Violin v, 4 Violin *pv=&v; 5 pv->ejecutar(); 6 cout <<"Caso del Instrumenton"; 7 Instrumento i, 8 Instrumento *pi=&i; 9 pi->ejecutar(); 10 cout <<"Caso Mixton"; 11 Instrumento *pi_2 12 pi_2=&v; 13 pi_2->ejecutar(); 14 return(0); 15 } • Salida Caso del Violin: Violin::ejecutar • Salida Caso del Instrumento: Instrumento::ejecutar • Salida Caso Mixto: Violin::ejecutar
  65. 65. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Los m´etodos virtuales puros no tienen definici´on.
  66. 66. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Los m´etodos virtuales puros no tienen definici´on. • Una clase con al menos un m´etodo virtual puro es una clase abstracta.
  67. 67. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Los m´etodos virtuales puros no tienen definici´on. • Una clase con al menos un m´etodo virtual puro es una clase abstracta. 1 class Instrumento { 2 public: 3 virtual void ejecutar() = 0; 4 virtual string nombre() = 0; 5 }; 6 class Piano : public Instrumento { 7 public: 8 void ejecutar() {cout << "Piano::ejecutar";}; 9 string nombre() {return "Piano";}; 10 }; 11 class Violin : public Instrumento { 12 public: 13 void ejecutar() {cout << "Violin::ejecutar";} 14 string nombre() {return "Violin";} 15 };
  68. 68. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Las clases abstractas son aquellas en las que al menos uno de sus miembros es virtual puro.
  69. 69. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Las clases abstractas son aquellas en las que al menos uno de sus miembros es virtual puro. • Cuando todos los miembros son virtuales puros se habla de clases abstractas genuinas.
  70. 70. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Las clases abstractas son aquellas en las que al menos uno de sus miembros es virtual puro. • Cuando todos los miembros son virtuales puros se habla de clases abstractas genuinas. • Las clases abstractas no pueden instanciarse, pues tampoco tiene sentido hacerlo.
  71. 71. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Las clases abstractas son aquellas en las que al menos uno de sus miembros es virtual puro. • Cuando todos los miembros son virtuales puros se habla de clases abstractas genuinas. • Las clases abstractas no pueden instanciarse, pues tampoco tiene sentido hacerlo. • Ahora Instrumento es una clase abstracta genuina.
  72. 72. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Tabla de m´etodos virtuales • El compilador crea una tabla de m´etodos virtuales (VTABLE) para cada clase, que ser´a usada durante la ejecuci´on del programa.
  73. 73. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Tabla de m´etodos virtuales • El compilador crea una tabla de m´etodos virtuales (VTABLE) para cada clase, que ser´a usada durante la ejecuci´on del programa. • El compilador ubica en esta VTABLE las funciones virtuales de cada clase.
  74. 74. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Tabla de m´etodos virtuales • El compilador crea una tabla de m´etodos virtuales (VTABLE) para cada clase, que ser´a usada durante la ejecuci´on del programa. • El compilador ubica en esta VTABLE las funciones virtuales de cada clase. • El compilador tambi´en agrega a cada clase un puntero (VPTR), que apunta a cada VTABLE correspondiente.
  75. 75. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Tabla de m´etodos virtuales • El compilador crea una tabla de m´etodos virtuales (VTABLE) para cada clase, que ser´a usada durante la ejecuci´on del programa. • El compilador ubica en esta VTABLE las funciones virtuales de cada clase. • El compilador tambi´en agrega a cada clase un puntero (VPTR), que apunta a cada VTABLE correspondiente. • Cuando se invoca a un m´etodo virtual a trav´es de un puntero de la clase base, el compilador inserta c´odigo para determinar qu´e VPTR realiz´o la llamada y busca la direcci´on de la funci´on en la VTABLE
  76. 76. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Tabla de m´etodos virtuales • El compilador crea una tabla de m´etodos virtuales (VTABLE) para cada clase, que ser´a usada durante la ejecuci´on del programa. • El compilador ubica en esta VTABLE las funciones virtuales de cada clase. • El compilador tambi´en agrega a cada clase un puntero (VPTR), que apunta a cada VTABLE correspondiente. • Cuando se invoca a un m´etodo virtual a trav´es de un puntero de la clase base, el compilador inserta c´odigo para determinar qu´e VPTR realiz´o la llamada y busca la direcci´on de la funci´on en la VTABLE • Ahora creando los objetos en forma din´amica, resolvemos el problema originalmente planteado.
  77. 77. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Dada dos instrumentos, un Piano y un Viol´ın
  78. 78. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Dada dos instrumentos, un Piano y un Viol´ın • ¿C´omo hacemos para decidir en tiempo de ejecuci´on que tipo de instrumento quiero que toque una nota?
  79. 79. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Una forma ser´ıa la siguiente:
  80. 80. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Una forma ser´ıa la siguiente: 1 switch(opcion){ 2 caso 1: 3 Creo un Piano 4 Lo hago Tocar 5 caso 2: 6 Creo un Violin 7 Lo hago Tocar 8 }
  81. 81. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Una forma ser´ıa la siguiente: 1 switch(opcion){ 2 caso 1: 3 Creo un Piano 4 Lo hago Tocar 5 caso 2: 6 Creo un Violin 7 Lo hago Tocar 8 } • Otra forma:
  82. 82. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Una forma ser´ıa la siguiente: 1 switch(opcion){ 2 caso 1: 3 Creo un Piano 4 Lo hago Tocar 5 caso 2: 6 Creo un Violin 7 Lo hago Tocar 8 } • Otra forma: 1 switch(opcion){ 2 caso 1: 3 Creo un Piano 4 caso 2: 5 Creo un Violin 6 } 7 Hago tocar el INSTRUMENTO
  83. 83. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Por lo tanto necesitamos asignaci´on din´amica de memoria
  84. 84. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Por lo tanto necesitamos asignaci´on din´amica de memoria • Para referirnos a un objeto din´amico utilizamos un puntero a su instancia. Por ejemplo:
  85. 85. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Por lo tanto necesitamos asignaci´on din´amica de memoria • Para referirnos a un objeto din´amico utilizamos un puntero a su instancia. Por ejemplo: 1 Piano * p; 2 //... 3 p->ejecutar(); 4 cout << p->nombre() << endl; 5 //...
  86. 86. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Para crear un objeto en tiempo de ejecuci´on es necesario utilizar el operador new. Por ejemplo:
  87. 87. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Para crear un objeto en tiempo de ejecuci´on es necesario utilizar el operador new. Por ejemplo: 1 Piano * p; 2 p=new Piano; 3 p->ejecutar(); 4 cout << p->nombre() << endl; 5 //...
  88. 88. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Para destruir un objeto din´amico utilizamos el operador delete. Por ejemplo:
  89. 89. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Para destruir un objeto din´amico utilizamos el operador delete. Por ejemplo: 1 Piano * p; 2 p=new Piano; 3 p->ejecutar(); 4 cout << p->nombre() << endl; 5 delete p;
  90. 90. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Creaci´on de un objeto din´amico a partir de un puntero a la clase base
  91. 91. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Creaci´on de un objeto din´amico a partir de un puntero a la clase base 1 Instrumento * p; 2 p=new Piano; 3 p->ejecutar(); 4 cout << p->nombre() << endl; 5 delete p;
  92. 92. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 class Instrumento { 2 public: 3 Instrumento() { 4 cout << "Constructor de Instrumento" << endl;}; 5 virtual void ejecutar(nota) =0; 6 virtual string nombre() =0; 7 virtual ˜Instrumento() { 8 cout << "Destructor de Instrumento" << endl;}; 9 };
  93. 93. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 class Instrumento { 2 public: 3 Instrumento() { 4 cout << "Constructor de Instrumento" << endl;}; 5 virtual void ejecutar(nota) =0; 6 virtual string nombre() =0; 7 virtual ˜Instrumento() { 8 cout << "Destructor de Instrumento" << endl;}; 9 }; • Los constructores no pueden ser virtuales.
  94. 94. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 class Instrumento { 2 public: 3 Instrumento() { 4 cout << "Constructor de Instrumento" << endl;}; 5 virtual void ejecutar(nota) =0; 6 virtual string nombre() =0; 7 virtual ˜Instrumento() { 8 cout << "Destructor de Instrumento" << endl;}; 9 }; • Los constructores no pueden ser virtuales. • Los destructores pueden y deben ser virtuales
  95. 95. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 class Instrumento { 2 public: 3 Instrumento() { 4 cout << "Constructor de Instrumento" << endl;}; 5 virtual void ejecutar(nota) =0; 6 virtual string nombre() =0; 7 virtual ˜Instrumento() { 8 cout << "Destructor de Instrumento" << endl;}; 9 }; • Los constructores no pueden ser virtuales. • Los destructores pueden y deben ser virtuales¿Por qu´e?
  96. 96. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 int main(){ 2 Instrumento *I; 3 I= new Piano; 4 /*...*/
  97. 97. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 int main(){ 2 Instrumento *I; 3 I= new Piano; 4 /*...*/ 5 delete I; 6 return 0;} • Siempre se conoce al objeto que se desea crear.
  98. 98. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Constructores y destructores 1 int main(){ 2 Instrumento *I; 3 I= new Piano; 4 /*...*/ 5 delete I; 6 return 0;} • Siempre se conoce al objeto que se desea crear. • Sin embargo, no se sabe cual es el objeto que se destruye dado que estamos referenciado un ancestro.
  99. 99. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Downcasting 1 class Violin : public Instrumento { 2 public: 3 void ejecutar(); 4 string nombre(); 5 void CambiarCuerdas() 6 { cout << "Cambio de cuerdas" << endl; } 7 };
  100. 100. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Downcasting 1 class Violin : public Instrumento { 2 public: 3 void ejecutar(); 4 string nombre(); 5 void CambiarCuerdas() 6 { cout << "Cambio de cuerdas" << endl; } 7 }; 8 9 int main() 10 {Instrumento *i = new Violin; 11 i->CambiarCuerdas(); 12 return 0; 13 } • No se puede acceder dado que CambiarCuerdas() no es un miembro de Instrumento
  101. 101. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Downcasting 1 int main() 2 {Instrumento *i = new Violin; 3 /* ... */ 4 Violin *v;
  102. 102. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Downcasting 1 int main() 2 {Instrumento *i = new Violin; 3 /* ... */ 4 Violin *v; 5 v=(Violin*) i;// downcasting 6 v->CambiarCuerdas(); 7 return 0; 8 }
  103. 103. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo y contenedoras • ¿C´omo podr´ıamos simular una orquesta formada por una arreglo de instrumentos?
  104. 104. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo y contenedoras • ¿C´omo podr´ıamos simular una orquesta formada por una arreglo de instrumentos? • Necesitaremos una lista de punteros a Instrumento 1 vector<Instrumento*> orquesta; 2 //new...
  105. 105. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo y contenedoras • ¿C´omo podr´ıamos simular una orquesta formada por una arreglo de instrumentos? • Necesitaremos una lista de punteros a Instrumento 1 vector<Instrumento*> orquesta; 2 //new... • ¿Cu´al es la ventaja de que sean polim´orficos?
  106. 106. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo y contenedoras • ¿C´omo podr´ıamos simular una orquesta formada por una arreglo de instrumentos? • Necesitaremos una lista de punteros a Instrumento 1 vector<Instrumento*> orquesta; 2 //new... • ¿Cu´al es la ventaja de que sean polim´orficos? 1 for (int i=0;i<orquesta.size();i++) 2 cout << orquesta[i]->ejecutar(); 3 //delete...

×