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

Polimorfismo2015c1

  • 1.
    Introducci´on Herencia Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Polimorfismo Programaci´on Avanzada 30 de marzo de 2015
  • 2.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario:
  • 9.
    Introducci´on Herencia Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario: • Herencia.
  • 10.
    Introducci´on Herencia Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Mecanismo necesarios • Para realizar polimorfismo en C++ es necesario: • Herencia. • Funciones virtuales.
  • 11.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Ejemplo de jugete Modelado de una Orquesta
  • 13.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Herencia • Es una forma de reutilizar c´odigo.
  • 15.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Herencia Ejemplo de jugete
  • 23.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Herencia Sintaxis 1 class nombre_clase_derivada: public nombre_clase_base { /*...*/ };
  • 26.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Upcasting • Otro ejemplo para analizar:
  • 41.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Funciones virtuales • Analicemos otra situaci´on:
  • 57.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Clases abstractas • Los m´etodos virtuales puros no tienen definici´on.
  • 66.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Dada dos instrumentos, un Piano y un Viol´ın
  • 78.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Una forma ser´ıa la siguiente:
  • 80.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Objetos din´amicos • Por lo tanto necesitamos asignaci´on din´amica de memoria
  • 84.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales Objetos din´amicos M´as sobre polimorfismo Downcasting 1 int main() 2 {Instrumento *i = new Violin; 3 /* ... */ 4 Violin *v;
  • 102.
    Introducci´on Herencia Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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 Funcionesvirtuales 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...