SlideShare una empresa de Scribd logo
1 de 106
Descargar para leer sin conexión
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Polimorfismo
Programaci´on Avanzada
30 de marzo de 2015
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
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
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:
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.
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.
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Mecanismo necesarios
• Para realizar polimorfismo en C++ es necesario:
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Mecanismo necesarios
• Para realizar polimorfismo en C++ es necesario:
• Herencia.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Mecanismo necesarios
• Para realizar polimorfismo en C++ es necesario:
• Herencia.
• Funciones virtuales.
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Ejemplo de jugete
Modelado de una Orquesta
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Herencia
• Es una forma de reutilizar c´odigo.
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).
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.
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?
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:
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.
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.
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Herencia
Ejemplo de jugete
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.
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Herencia
Sintaxis
1 class nombre_clase_derivada: public nombre_clase_base { /*...*/ };
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 { /* ... */};
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 };
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 };
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 };
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 }
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;
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 }
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.
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.
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?
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.
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:
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.
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Upcasting
• Otro ejemplo para analizar:
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();
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;}
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
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
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
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
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
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.
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.
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 };
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 };
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 };
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 }
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;
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 }
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Funciones virtuales
• Analicemos otra situaci´on:
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();
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();
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:
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
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:
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
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:
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
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Clases abstractas
• Los m´etodos virtuales puros no tienen definici´on.
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.
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 };
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.
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.
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.
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.
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.
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.
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.
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
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.
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Objetos din´amicos
• Dada dos instrumentos, un Piano y un Viol´ın
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?
Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo
Objetos din´amicos
• Una forma ser´ıa la siguiente:
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 }
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:
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
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
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:
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 //...
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:
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 //...
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:
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;
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
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;
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 };
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.
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
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?
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 /*...*/
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.
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.
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 };
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
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;
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 }
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?
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...
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?
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...

Más contenido relacionado

Destacado

Programme du Sax | Saison 2014-2015
Programme du Sax | Saison 2014-2015Programme du Sax | Saison 2014-2015
Programme du Sax | Saison 2014-2015Le Sax
 
Tecnologia
TecnologiaTecnologia
Tecnologialudiviko
 
Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Macropru Reader
 
Sustainable performance dossier de production groupe 72 campus de lille
Sustainable performance dossier de production groupe 72 campus de lilleSustainable performance dossier de production groupe 72 campus de lille
Sustainable performance dossier de production groupe 72 campus de lilleJérém Frajar
 
Presentacion nitcs ludi
Presentacion nitcs ludiPresentacion nitcs ludi
Presentacion nitcs ludiludiviko
 
Investigacion sobre la_muerte
Investigacion sobre la_muerteInvestigacion sobre la_muerte
Investigacion sobre la_muerteItalo Orozco
 
Evaluation question 4
Evaluation question 4Evaluation question 4
Evaluation question 4Maia Legg
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sortiesyazidds2
 
Quand Winston Churchill faisait de l'analyse de la valeur...
Quand Winston Churchill faisait de l'analyse de la valeur...Quand Winston Churchill faisait de l'analyse de la valeur...
Quand Winston Churchill faisait de l'analyse de la valeur...Frederic VINDREAU
 
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAU
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAUSORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAU
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAUciclesuperiorescolapalau
 
Dossier de production groupe 103.pdf
Dossier de production groupe 103.pdfDossier de production groupe 103.pdf
Dossier de production groupe 103.pdfRima Dw
 
Franche comté Jéssica
Franche comté Jéssica Franche comté Jéssica
Franche comté Jéssica Jéssica Silva
 

Destacado (17)

Formations tertiaires Brest
Formations tertiaires BrestFormations tertiaires Brest
Formations tertiaires Brest
 
Face parts
Face partsFace parts
Face parts
 
Ley de medios
Ley de mediosLey de medios
Ley de medios
 
Programme du Sax | Saison 2014-2015
Programme du Sax | Saison 2014-2015Programme du Sax | Saison 2014-2015
Programme du Sax | Saison 2014-2015
 
Tecnologia
TecnologiaTecnologia
Tecnologia
 
Rey banquedefrance 11-2014
Rey banquedefrance 11-2014Rey banquedefrance 11-2014
Rey banquedefrance 11-2014
 
Sustainable performance dossier de production groupe 72 campus de lille
Sustainable performance dossier de production groupe 72 campus de lilleSustainable performance dossier de production groupe 72 campus de lille
Sustainable performance dossier de production groupe 72 campus de lille
 
Presentacion nitcs ludi
Presentacion nitcs ludiPresentacion nitcs ludi
Presentacion nitcs ludi
 
Mlearnig
MlearnigMlearnig
Mlearnig
 
Investigacion sobre la_muerte
Investigacion sobre la_muerteInvestigacion sobre la_muerte
Investigacion sobre la_muerte
 
Evaluation question 4
Evaluation question 4Evaluation question 4
Evaluation question 4
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sorties
 
Como el agua
Como el aguaComo el agua
Como el agua
 
Quand Winston Churchill faisait de l'analyse de la valeur...
Quand Winston Churchill faisait de l'analyse de la valeur...Quand Winston Churchill faisait de l'analyse de la valeur...
Quand Winston Churchill faisait de l'analyse de la valeur...
 
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAU
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAUSORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAU
SORTIDA A CAN CORTÉS - SEGON PRIMÀRIA - ESCOLA PALAU
 
Dossier de production groupe 103.pdf
Dossier de production groupe 103.pdfDossier de production groupe 103.pdf
Dossier de production groupe 103.pdf
 
Franche comté Jéssica
Franche comté Jéssica Franche comté Jéssica
Franche comté Jéssica
 

Similar a Polimorfismo2015c1

Introduccion a la poo
Introduccion a la pooIntroduccion a la poo
Introduccion a la pooBoris Salleg
 
JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxFamiliaAyluardo
 
Pycon es 17 noviembre 2014
Pycon es 17 noviembre 2014Pycon es 17 noviembre 2014
Pycon es 17 noviembre 2014Sergio Soto
 
Iniciando en java en www.fiec.espol.edu.ec
Iniciando en java  en www.fiec.espol.edu.ecIniciando en java  en www.fiec.espol.edu.ec
Iniciando en java en www.fiec.espol.edu.ecSilvana Vargas
 
El poder de los reptiles: Hacer herramientas de hacking es fácil
El poder de los reptiles: Hacer herramientas de hacking es fácilEl poder de los reptiles: Hacer herramientas de hacking es fácil
El poder de los reptiles: Hacer herramientas de hacking es fácilDaniel Garcia (a.k.a cr0hn)
 
Aula Virtual y actitvidades TIC en Primaria
Aula Virtual y actitvidades TIC en PrimariaAula Virtual y actitvidades TIC en Primaria
Aula Virtual y actitvidades TIC en Primariaantjueduland
 
Programacion orientada-a-objetos-poo
Programacion orientada-a-objetos-poo Programacion orientada-a-objetos-poo
Programacion orientada-a-objetos-poo LuigyDeLaTorre
 
instrumentos de trabajo
instrumentos de trabajoinstrumentos de trabajo
instrumentos de trabajojorpical
 
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casaTypeScript para Javeros: Cómo programar web front-end y sentirse como en casa
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casaMicael Gallego
 
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011Jano González
 
Polimorfismo en Java
Polimorfismo en JavaPolimorfismo en Java
Polimorfismo en Javaricardomore94
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQueryDanae Aguilar Guzmán
 

Similar a Polimorfismo2015c1 (20)

Introduccion a la poo
Introduccion a la pooIntroduccion a la poo
Introduccion a la poo
 
JAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptxJAVA_BASICO_modo_consola_introduccion.pptx
JAVA_BASICO_modo_consola_introduccion.pptx
 
Pycon es 17 noviembre 2014
Pycon es 17 noviembre 2014Pycon es 17 noviembre 2014
Pycon es 17 noviembre 2014
 
Iniciando en java en www.fiec.espol.edu.ec
Iniciando en java  en www.fiec.espol.edu.ecIniciando en java  en www.fiec.espol.edu.ec
Iniciando en java en www.fiec.espol.edu.ec
 
El poder de los reptiles: Hacer herramientas de hacking es fácil
El poder de los reptiles: Hacer herramientas de hacking es fácilEl poder de los reptiles: Hacer herramientas de hacking es fácil
El poder de los reptiles: Hacer herramientas de hacking es fácil
 
Prototype-based programming with PROWL.
Prototype-based programming with PROWL.Prototype-based programming with PROWL.
Prototype-based programming with PROWL.
 
06 patrones
06 patrones06 patrones
06 patrones
 
Aula Virtual y Actividades TIC en Primaria
Aula Virtual y Actividades TIC en PrimariaAula Virtual y Actividades TIC en Primaria
Aula Virtual y Actividades TIC en Primaria
 
Aula Virtual y actitvidades TIC en Primaria
Aula Virtual y actitvidades TIC en PrimariaAula Virtual y actitvidades TIC en Primaria
Aula Virtual y actitvidades TIC en Primaria
 
Polimorfismo
PolimorfismoPolimorfismo
Polimorfismo
 
Programacion orientada-a-objetos-poo
Programacion orientada-a-objetos-poo Programacion orientada-a-objetos-poo
Programacion orientada-a-objetos-poo
 
instrumentos de trabajo
instrumentos de trabajoinstrumentos de trabajo
instrumentos de trabajo
 
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casaTypeScript para Javeros: Cómo programar web front-end y sentirse como en casa
TypeScript para Javeros: Cómo programar web front-end y sentirse como en casa
 
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
 
Polimorfismo en Java
Polimorfismo en JavaPolimorfismo en Java
Polimorfismo en Java
 
Prototype-based, object-oriented programming
Prototype-based, object-oriented programmingPrototype-based, object-oriented programming
Prototype-based, object-oriented programming
 
Semana 3 Herencia en Java
Semana 3   Herencia en JavaSemana 3   Herencia en Java
Semana 3 Herencia en Java
 
Tema3
Tema3Tema3
Tema3
 
Javascript - 2014
Javascript - 2014Javascript - 2014
Javascript - 2014
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 

Último

3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdfRicardoRomeroUrbano
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfIsbelRodrguez
 
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALES
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALESMAPA CONCEPTUAL: MANIFESTACIONES CULTURALES
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALESjhosselinvargas
 
Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1victorrodrigues972054
 
Peligros de Excavaciones y Zanjas presentacion
Peligros de Excavaciones y Zanjas presentacionPeligros de Excavaciones y Zanjas presentacion
Peligros de Excavaciones y Zanjas presentacionOsdelTacusiPancorbo
 
Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasSegundo Silva Maguiña
 
Sistema de Base de Datos para renta de trajes
Sistema de Base de Datos para renta de trajesSistema de Base de Datos para renta de trajes
Sistema de Base de Datos para renta de trajesjohannyrmnatejeda
 
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptx
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptxI LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptx
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptxPATRICIAKARIMESTELAL
 
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...esandoval7
 
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptx
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptxFORMATO REPORTE SEMANAL KLEF - Sem 15.pptx
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptxSAMAELAUGURIOFIGUERE
 
Ley 29783 ALCANCES E INTERPRETACION ----
Ley 29783 ALCANCES E INTERPRETACION ----Ley 29783 ALCANCES E INTERPRETACION ----
Ley 29783 ALCANCES E INTERPRETACION ----AdministracionSSTGru
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosJeanCarlosLorenzo1
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)ssuser6958b11
 
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptxNayeliZarzosa1
 
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptxJOSLUISCALLATAENRIQU
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Francisco Javier Mora Serrano
 
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdf
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdfPRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdf
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdfAuraGabriela2
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCANDECE
 

Último (20)

3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf3.3 Tipos de conexiones en los transformadores trifasicos.pdf
3.3 Tipos de conexiones en los transformadores trifasicos.pdf
 
Historia de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdfHistoria de la Arquitectura II, 1era actividad..pdf
Historia de la Arquitectura II, 1era actividad..pdf
 
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALES
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALESMAPA CONCEPTUAL: MANIFESTACIONES CULTURALES
MAPA CONCEPTUAL: MANIFESTACIONES CULTURALES
 
Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1Electricidad y electronica industrial unidad 1
Electricidad y electronica industrial unidad 1
 
Linea del tiempo de la inteligencia artificial.pptx
Linea del tiempo de la inteligencia artificial.pptxLinea del tiempo de la inteligencia artificial.pptx
Linea del tiempo de la inteligencia artificial.pptx
 
Peligros de Excavaciones y Zanjas presentacion
Peligros de Excavaciones y Zanjas presentacionPeligros de Excavaciones y Zanjas presentacion
Peligros de Excavaciones y Zanjas presentacion
 
Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la Ingenierías
 
Sistema de Base de Datos para renta de trajes
Sistema de Base de Datos para renta de trajesSistema de Base de Datos para renta de trajes
Sistema de Base de Datos para renta de trajes
 
presentación manipulación manual de cargas sunafil
presentación manipulación manual de cargas sunafilpresentación manipulación manual de cargas sunafil
presentación manipulación manual de cargas sunafil
 
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptx
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptxI LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptx
I LINEAMIENTOS Y CRITERIOS DE INFRAESTRUCTURA DE RIEGO.pptx
 
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...Simbología de Soldadura,  interpretacion y aplicacion en dibujo tecnico indus...
Simbología de Soldadura, interpretacion y aplicacion en dibujo tecnico indus...
 
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptx
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptxFORMATO REPORTE SEMANAL KLEF - Sem 15.pptx
FORMATO REPORTE SEMANAL KLEF - Sem 15.pptx
 
Ley 29783 ALCANCES E INTERPRETACION ----
Ley 29783 ALCANCES E INTERPRETACION ----Ley 29783 ALCANCES E INTERPRETACION ----
Ley 29783 ALCANCES E INTERPRETACION ----
 
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de ProyectosRevista estudiantil, trabajo final Materia ingeniería de Proyectos
Revista estudiantil, trabajo final Materia ingeniería de Proyectos
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
 
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
5.1 MATERIAL COMPLEMENTARIO Sesión 02.pptx
 
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx5. MATERIAL COMPLEMENTARIO - PPT  de la Sesión 02.pptx
5. MATERIAL COMPLEMENTARIO - PPT de la Sesión 02.pptx
 
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
Hanns Recabarren Diaz (2024), Implementación de una herramienta de realidad v...
 
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdf
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdfPRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdf
PRIMER Y SEGUNDO TEOREMA DE CASTIGLIANO.pdf
 
Edificio residencial Becrux en Madrid. Fachada de GRC
Edificio residencial Becrux en Madrid. Fachada de GRCEdificio residencial Becrux en Madrid. Fachada de GRC
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.
  • 12. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Ejemplo de jugete Modelado de una Orquesta
  • 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.
  • 22. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Herencia Ejemplo de jugete
  • 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 { /* ... */};
  • 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. 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. 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. 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. 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. 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. 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.
  • 40. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar:
  • 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. 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. 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.
  • 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. 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. 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. 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. 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. 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. Introducci´on Herencia Funciones virtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on:
  • 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. 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;
  • 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. 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.
  • 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. 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. 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. 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. 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...