Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Polimorfismo2015c1

180 Aufrufe

Veröffentlicht am

polimorfismo y herencia en c++

Veröffentlicht in: Ingenieurwesen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

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...

×