Edificio residencial Becrux en Madrid. Fachada de GRC
Polimorfismo2015c1
1. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Polimorfismo
Programaci´on Avanzada
30 de marzo de 2015
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. 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. 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. 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. 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. 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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Mecanismo necesarios
• Para realizar polimorfismo en C++ es necesario:
9. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Mecanismo necesarios
• Para realizar polimorfismo en C++ es necesario:
• Herencia.
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. 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.
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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Herencia
• Es una forma de reutilizar c´odigo.
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. 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. 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. 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. 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. 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. 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.
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. 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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Herencia
Sintaxis
1 class nombre_clase_derivada: public nombre_clase_base { /*...*/ };
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 { /* ... */};
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. 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. 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. 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. 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. 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. 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.
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. 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. 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. 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. 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. 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. 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.
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. 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. 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. 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. 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. 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. 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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Clases abstractas
• Los m´etodos virtuales puros no tienen definici´on.
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Objetos din´amicos
• Una forma ser´ıa la siguiente:
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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;
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. 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. 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. 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. 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. 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.
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. 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. 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. 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...