La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Polimorfismo en C++ Unidad I – Programación Orientada a Objetos en C++ Programación I - 0416202.

Presentaciones similares


Presentación del tema: "Polimorfismo en C++ Unidad I – Programación Orientada a Objetos en C++ Programación I - 0416202."— Transcripción de la presentación:

1 Polimorfismo en C++ Unidad I – Programación Orientada a Objetos en C++ Programación I - 0416202

2 Polimorfismo Contenido Esta lección abarca los siguientes temas: Polimorfismo  Sobrecarga de métodos  Sobrecarga de operadores  Basado en herencia Clases abstractas Type ID Números aleatorios

3 Polimorfismo Polimorfismo El polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía. Encender Apagar

4 Polimorfismo Polimorfismo El polimorfismo en en C++, puede ser usado de tres maneras fundamentales:  Polimorfismo en sobrecarga de Métodos.  Polimorfismo en sobrecarga de operadores.  Polimorfismo basado en la Herencia

5 Polimorfismo Sobrecarga de métodos Una de las formas que utiliza C++ para obtener el polimorfismo es a través de la sobrecarga de funciones. Permite que dos o más funciones compartan el mismo nombre siempre que la declaración de sus parámetros sea diferente. El compilador sabe distinguir el tipo de función a utilizar según sea el tipo de dato enviado en el argumento de la llamada de la función.

6 Polimorfismo Sobrecarga de métodos class trabajador{ char nombre[40]; long numero; float sueldo; public: void leer(char * cad, char *c); void leer(char * cad, long *l); void leer(char * cad, float *f); void set_nom(char *c){strcpy(nombre,c);} void set_num(long l){numero=l;} void set_sue(float s){sueldo=s;} }; void trabajador::leer(char *cad, char *n) { cout<<cad; cin>>n; } void trabajador::leer(char *cad, long *l) { cout<<cad; cin>>*l; } void trabajador::leer(char *cad, float *s) { cout<<cad; cin>>*s; }

7 Polimorfismo Sobrecarga de métodos void main (void){ char n[40]; long l; float s; trabajador T; T.leer(“Ingrese una cadena de caracteres”, n); T.set_nom(n); T.leer(“Ingrese un numero largo”,&l); T.set_num(l); T.leer(“Ingrese un numero flotante”,&s); T.set_sue(s); }

8 Polimorfismo Sobrecarga de constructores class libro{ char titulo[50]; char autor[40]; int nro_ejemplares; public: libro(); libro(char * t, char * a, int n); libro(int n); void mostrar(); }; libro::libro(){ strcpy(titulo, “”); strcpy(autor, “”); nro_ejemplares=0; } libro::libro(char * t, char * a, int n){ strcpy(titulo, t); strcpy(autor, a); nro_ejemplares=n; } libro::libro(int n){ nro_ejemplares=n; } void libro::mostrar(){ cout<<“\nLibro: ”<<titulo; cout<<“\nAutor: ”<<autor; cout << “\nCantidad de ejemplares:” << nro_ejemplares; }

9 Polimorfismo Sobrecarga de constructores void main(){ libro a; cout<<“\nObjeto a”; a.mostrar(); libro b(“Programacion en C++”, ”Luis Joyanes Aguilar”, 5); cout<<“\n\nObjeto b”; b.mostrar(); libro c(3); cout<<“\n\nObjeto c”; c.mostrar(); getch(); } Objeto a Libro: Autor: Cantidad de ejemplares: 0 Objeto b Libro: Programacion en C++ Autor: Luis Joyanes Aguilar Cantidad de ejemplares: 5 Objeto c Libro: Autor: Cantidad de ejemplares: 3

10 Polimorfismo Sobrecarga de operadores La sobrecarga de operadores es el proceso de cambiar el significado de un operador para su uso con objetos de una clase específica. Cuando se sobrecarga un operador, se específica una función que C++ invoca cada vez que la clase utiliza el operador sobrecargado. Los operadores se pueden sobrecargar escribiendo una definición de función (con encabezado y cuerpo), excepto que ahora el nombre de la función es la palabra reservada operator, seguida del símbolo del operador que se desea sobrecargar.

11 Polimorfismo Sobrecarga de operadores Un ejemplo recientemente utilizado es con los operadores >> y <<, que además de ser usados por C++ para desplazamiento de bits también permiten realizar operaciones de E/S por consola. Esto es posible porque en la librería iostream.h, estos operadores son sobrecargados. Los operadores sobrecargados toman un significado adicional para la clase con la que está directamente relacionada y además, sigue teniendo todos sus significados anteriores.

12 Polimorfismo Sobrecarga de operadores C++ permite cambiar el significado de la mayoría de los operadores básicos como + - * / = Sin embargo C++ solo permite este cambio si los “operandos” no son tipos básicos (int, float, double, etc), sino que son objetos de clases creadas por nosotros Por ejemplo, imagine que tenemos dos objetos de una clase Trabajador y queremos sumarlos. Trabajador obj1, obj2 obj1+obj2 Para poder realizar la operación anterior, tendríamos que sobrecargar el operador + porque éste solo suma números y strings.

13 Polimorfismo Sobrecarga de operadores class trabajador{ char nombre[40]; int edad; float sueldo; public: //Constructores trabajador(); trabajador(char * n, int e, float s); //Función que sobrecarga el operador + trabajador operator+ (trabajador obj); //Otras funciones miembro void mostrar(); };

14 Polimorfismo Sobrecarga de operadores trabajador::trabajador(){ } trabajador::trabajador(char * n, int e, float s){ strcpy(nombre,n); edad=e; sueldo=s; } trabajador trabajador::operator+ (trabajador obj){ trabajador obj_aux; sueldo obj_aux.sueldo = sueldo + obj.sueldo; edad obj_aux.edad = edad + obj.edad; nombre strcpy(obj_aux.nombre, strcat(nombre, obj.nombre)); return obj_aux; } void trabajador::mostrar(){ cout<<“\nNombre: ”<<nombre; cout<<“\nEdad: ”<<edad; cout<<“\nSueldo: ”<<sueldo; } sueldoedadnombre sueldo, edad y nombre son los atributos del objeto que invoca

15 Polimorfismo Sobrecarga de operadores void main(){ trabajador obj1(“Luis”, 36, 700); trabajador obj2(“Ana”, 30, 900); + obj1 = obj1 + obj2; obj1.mostrar(); getch(); } Objeto que invoca Objeto que Se envía como argumento Nombre: LuisAna Edad: 66 Sueldo: 1600

16 Polimorfismo Basado en Herencia En POO, el polimorfismo permite que diferentes objetos respondan de modo diferente al mismo mensaje (invocación de método). El polimorfismo adquiere su máxima potencia cuando se utiliza en unión de la herencia. El polimorfismo en C++ se ejecuta utilizando funciones virtuales. Existen dos formas de trabajar con funciones virtuales  Funciones virtuales puras  Funciones virtuales normales

17 Polimorfismo Basado en Herencia Reglas para usar polimorfismo en C++ Crear una jerarquía de clases en donde las operaciones importantes se definan en funciones miembros declaradas como virtuales en las clases base pero sin implementación alguna. Implementar las funciones virtuales en las clases derivadas. Cada clase derivada puede tener su propia versión de las funciones. Las instancias de éstas clases se manipulan a través de punteros.

18 Polimorfismo Basado en Herencia Funciones virtuales puras Cuando una función virtual es pura, el método de la clase madre se convierte en un método abstracto, por lo que la clase se hace abstracta, y solo se puede implementar en las clases hijas. Para hacer una función virtual pura se coloca virtual void nombrefuncion() =0;

19 Polimorfismo Basado en Herencia Funciones virtuales normales Cuando una función virtual es normal, el método de la clase madre se puede sobre escribir en las clases hijas (No hay clases abstractas) Para hacer una función virtual se coloca virtual void nombrefuncion();

20 Polimorfismo Basado en Herencia #include class Jugador{ char nombre[40]; char equipo[40] ; float average; public: //Constructores Jugador(); Jugador(char * n, char * e); //Función virtual virtual void calcular_average(); //Otras funciones miembro void setAverage(float a); };

21 Polimorfismo Basado en Herencia Jugador::Jugador(){ strcpy(nombre, ” ”); strcpy(equipo, ” ”); average = 0.0; } Jugador::Jugador(char * n, char * e){ strcpy(nombre, n); strcpy(equipo, e); average = 0.0; } void Jugador::calcular_average(){ cout<<“\nCalcular_average de Jugador”<<endl; } void Jugador::setAverage(float a){ average = a; } En la clase base, la función virtual se puede implementar pero no se le coloca la palabra virtual.

22 Polimorfismo Basado en Herencia class Bateador: public Jugador{ int nro_veces_bate; int nro_boletos_recibidos; int nro_hits; public: //Constructores Bateador(); Bateador(char * n, char * e, int v, int b, int h); //Sobreescritura de la funcion virtual virtual void calcular_average(); };

23 Polimorfismo Basado en Herencia Bateador::Bateador() : Juagador(){ nro_veces_bate=0; nro_boletos_recibidos=0; nro_hits=0; } Bateador::Bateador(char * n, char * e, int v, int b, int h ) : Jugador(n, e){ nro_veces_bate = v; nro_boletos_recibidos = b; nro_hits = h; } void Bateador::calcular_average(){ float x; x = (float) nro_hits / (nro_veces_bate – nro_boletos_recibidos) * 1000; set_average(x); cout<<“\nEl average del Bateador fue: ”<<x; //Si necesita ejecutar calcular_average de la clase Padre (Jugador) Jugador::calcular_average(); }

24 Polimorfismo Basado en Herencia void main(){ Jugador a(“Robert Perez”, ”Cardenales”); Bateador b(“Cesar Isturiz”, ”Cardenales”, 50, 8, 17); Jugador *p; p=&a; p->calcular_average(); p=&b; p->calcular_average(); cout<<“\n\nPresione una tecla para continuar”<<endl; getch(); } Calcular average de Jugador El average del Bateador fue: 404.762 Calcula average de Jugador

25 Polimorfismo Basado en Herencia void main(){ Jugador * vector[]={new Jugador("Robert Perez", "Cardenales"), new Bateador("Cesar Isturiz", "Cardenales", 50, 8, 17) }; vector[0]->calcular_average(); vector[1]->calcular_average(); cin.get(); } Calcular average de Jugador El average del Bateador fue: 404.762 Calcula average de Jugador

26 Polimorfismo Clases abstractas Una clase con funciones virtuales se hace abstracta al declarar una o más de sus funciones virtuales como puras. Una función virtual pura es aquella que en su declaración contiene un inicializador de = 0. Cuando una clase contiene por lo menos una función virtual pura automáticamente se convierte en clase abstracta y la función virtual pura pasa a ser un método abstracto, es decir, que no tiene implementación y debe ser redefinido o implementado en las clases hijas. No se pueden crear instancias de una clase abstracta.

27 Polimorfismo Clases abstractas #include “iostream.h” #include “conio.h” #include “math.h” class Figura{ int x,y; public: Figura(){x=0; y=0; } //Constructor //Función virtual pura ó método abstracto virtual void calcular_area() = 0; }; No debe tener implementación en Figura class Circulo: public Figura{ float radio; public: Circulo(){radio=2; } //Constructor //Implementación de la función virtual pura heredada void calcular_area(); }; void Circulo::calcular_area(){ float area= (float) 3.14 * pow(radio,2)/2; cout << “\nEl area es: ” << area; }

28 Polimorfismo Clases abstractas void main(){ Figura obj; //Error Circulo obj; obj.calcular_area(); getch(); } El area es: 6.28

29 Polimorfismo TypeID La palabra clave typeid identifica un operador con el que puede obtenerse el tipo de objetos y expresiones en tiempo de ejecución. Permite comprobar si un objeto es de un tipo particular, y si dos objetos son del mismo tipo. typeid( expresion ) typeid( nombre-de-tipo ) typeid(Clase).name(); typeid(Obj1)==typeid(Obj2) //comparación de los tipos //de objetos

30 Polimorfismo TypeID #include class Base { public: virtual void vvfunc() {} }; class Derived : public Base {}; int main() { Base* pb[5] ; pb[0]=new Base; pb[1]=new Derived; pb[2]=new Base; pb[3]=new Derived; pb[4]=new Derived; for(int i=0;i<5;i++) if(typeid( *pb[i] )==typeid(Derived)) cout <<"Objeto "<<i<<"= "<< typeid( *pb[i] ).name() << endl; system("PAUSE"); delete []pb; return 0;}

31 Polimorfismo Números aleatorios Para generar números aleatorios se utiliza la función rand(), incluida en la librería. Retorna un numero entero pseudo-aleatorio mayor igual a 0. Este número es generado por un algoritmo que retorna una sequencia de “aparentemente” números no relacionados cada vez que es llamada. Este algoritmo usa una “semilla” para generar la serie, el cual debe ser inicializada en distintos valores usando la función srand(). rand()% limite_superior + límite_inferior Ejemplo: rand()%100+1; //números del 1 al 100

32 Polimorfismo Números aleatorios #include using namespace std; int main(){ int iSecreto, iAdivino; srand (time(NULL)); //Inicializa la semilla con tiempo actual iSecreto = rand() % 10 + 1; //genera numero secreto entre 1 y 10 do { cout << “Adivine un numero entre (1 a 10): "; cin >> iAdivino ; if (iSecreto<iAdivino) cout << “El numero secreto es mas bajo“ << endl; else if (iSecreto>iAdivino) cout << "El numero secreto es mas alto“ << endl; } while (iSecreto!=iAdivino); cout << “Felicitaciones!"; return 0; }

33


Descargar ppt "Polimorfismo en C++ Unidad I – Programación Orientada a Objetos en C++ Programación I - 0416202."

Presentaciones similares


Anuncios Google