You are on page 1of 35
Tema: Polimorfismo por sobrecarga. erpone un método en la clase derivada, se ocultan todos los métodgs cor la clase base. Supongamos que hemos sobrecargado la funcién de , Iveremos a definir en la clase derivada: Cuando se SUP! mismo nombre en [2 | clase base que despues vO , Ejemplot: Polimorfismo por sobrecarga #include class ClaseA { public: void Incrementar() { cout << "Suma 1" << endl; } void Incrementar(int n) { cout << "Suma "<< 1n << endl; } i class ClaseB : public Clase { public: void Incrementar() { cout << "Suma 2" << endl; } i main() { //Declarando un objeto de la Clase base se ejemplifica sobrecarga de funciones /[ClaseA a; //aAncrementar(); /a.ncrementar(S); ClaseB objeto; objeto.Incrementar(); objeto.Incrementar(10); //Error, anular ésta linea para que funcione ‘//Para acceder a los métodos de la clase base cin.get(); } base au stone posible acceder a ninguna de las funciones superpuestas St Tes) einer distintos valores de retorno o distinto nimero 0 tP? FF so son ath ts Tunciones "ncrementar" de la clase base han quedado oc ne comaints mediante e! nombre completo. Por ello a linea marcada 008 iba como argum Puesto que no existe el método incrementar definida en la cas? lento un tipo de datos al que 10 sea convertible. Nota: En el polimorfi a debe existir, tanto en Ia clase base pol ismo por sobrecarga, Ia sobrecarge 9 mas métodas con el mismo como en la clase derivada, es decir, que existe al menos uno nombre y argumentos, los métodes de la clase derivada ocultan 2 los a eee zi solo se puede acceder a ellos (las métodas de Ia clase base) esr completo. Ejemplo 1.1 //Polimorfismo por sobrecarga #include #include class Cuadrado { protected: float |,a; public: void Lectura(); void Calculo(); void Salida(); i void Cuadrado::Lectura() { cout<<"Lado:"; cin>>l; P Void Cuadrado::Calculo() a=l*l; } void Cuadrado::Salida() { coute<"Area del Cuadrado="<>b; cout<<"Altura= cin>>h; } void Triangulo::Calculo() { a=(b*h)/2; } void Triangulo::Salida() cout<<"Area del Triangulo="< #include #include using namespace std; /{Clase base class SumaDos { protected: float a,b,c; public: void Lee(float &a, float &b); void Suma(float a, float b, float &c); void Escribe(float a, float b, float c); ‘i void SumaDos::Leé(float &a, float &b) { cout<<"A cin>>a; cout<<"B cin>>b; } void SumaDos::Suma(float a, float b, float &c) { c=atb; } void SumaDos::Escribe(float a, float b, float c) { cout<<"C = A + B\n"<>op; switch(op) case 1:Lee(a,b); Suma(a,b,c); Escribe(a,b,c); break; case 2:Lee(c); Suma(a,b,c,d); Escribe(a,b,c,d); break; case 3: exit(0); break; defaul:cout<<"Opcion Invalida"< #include #include class Clase { protected: int vi; public: void Incrementar() { cout<<"Valor inicial en clase base:"; cin>>vi; vievit5; cout <<"5+valor inicial="<>vi; vievit2; ae <<"2+valor inicial="< include //using namespace std; class B {// Clase-base public: int fun(int x) {return x * x;} // virtual class D1:public B {// Clase derivada-1 Public; it fun (int x) {return x + 10;} // virtual class D2:public 8 {// Clase derivada-2 Public: int fun (int x) {return x* 415;} // virtual ts main(void) { 5 D2 d2; po ee * ge b.fun(10) << eo cout << "El valor es:" << di.fun(10) << en" i cout << "El valor es: " ce d2.fun(10) << endl; , cout << "El valor es: » ce d1.Br:fun(10) << endl; cout << "El valor es: * ce d2.B::fun(10) << endl; cin.get(); return 0; } Ejemplo 5: Polimorfismo por sobrecarga [Polimorfismo por sobrecarga include #include #include class Enteros { protected: int nd,n2,n3,maxint; public: void capturar(void); void maximo(void); ik class Reales { protected: float nm1,nm2,nm3, . public: imaxfloat; void capturar(void); } void maximo(void); class Caracteres { Protected: char c1,c2,c3,maxchar; lic: : e void capturar(void); void maximo(void); i lass Menu:public Enteros,Reales,Caracteres dl " protected: int opcion; ublic: : : void capturar(void), ; void menu(void); i aximo(void) void Entero: { maxint=n1; if(n2>maxint) maxint=n2; if(n3>maxint) maxint=n3; } void Entéros::capturar(void) { cout<<"\nIngrese tres valores enteros: "; cout<<"\ningrese primer valor: cin>>n1; cout<<"\ningrese segundo val cin>>n2; cout<<"\ningrese terce valor: cin>>n3; i void Reales::maximo(void) { maxfioat=nm1; if(rm2>maxfloat) maxfloatenm2; if{nm3>maxfloat) maxfloat=nm3; i void Reales::capturar(void) cout<<"\ningrese tres valores reales "; cout<<"\ningrese primer valor: "; cin>>nm1; cout<<"\nIngrese segundo valor: "; cin>>nm2; cout<<"\nIngrese terce valor: "; cin>>nm3; maxchar=c1; if(c2>maxchar) maxchar=c2; if(c3>maxchar) maxchar=c3; } void Caracteres::capturar(void) { cout<<"\nIngrese tres caracteres"; cout<<"\nIngrese primer caracter: "; cin>>c1; Cout<<"\ningrese segundo caracter: "; cin>>c2; cout<<"\nIngrese terce caracter: is cin>>c3; J a Menu::menu(void) Menu M; system("cls" coutee"Avert ut<<"Averiguar el mayor de 3, elige entre:"<>opcion; Ihile(opciona); switch(opcion) { case 1 M Enteros::capturar(); M.Enteros::maximo(); cout<<"El valor mas grande es: "< #include using namespace std; class Polygon { protected: int width, height; public: void set_values (int a, int b) { width=a; height=b; } i class Rectangle: public Polygon { public: int area() {return width*height; } i class Triangle: public Polygon { public: int area() {return width*height/2; } i int main () Rectangle rect; Triangle trgl; Polygon * ppoly1 = ▭//Anulacién Polygon * Ppoly2 = &trgl;//Anulacién Ppoly1->set_values (4,5); Ppoly2->set_values (4,5); cout << rect.area() <<"\n'; Cout << trgl.area() <<"\n'; system("pause"); return 0; } Ejemplo 3: polimorfismo por anulacién y punteros //Polimorfismo por anulacién #include #include #include using namespace std; class suma{ public: virtual void leer(int &a, int &b, int &c); virtual void calculo(int &a, int &b, int &c); virtual void escribir(int &a, int &b, int &c); i class loop: public suma{ public: void leer(int &a, int &b, int &c); void calculo(int &a, int &b, int &c);//Meredo et virtva lded zy void escribir(int &a, int &b, int &c); i main(){ inta, b,c; Apart cy menoris ing ca e suma *s=new suma(); loop *I=new loop(); 5imboly foro apy tar staleer(a, b, c); s->calculofa, b, c); sescribir(a, b, c); // Anutacién sek sleera, b,c); s->calculo(a, b, c); s->escribir(a, b, c); system("pause"); void suma::leer(int &a, int &b, int &c){ cout << "SUMA" << endl; cout << "Ingresa numero a: "; cin >> a; cout << "Ingresa numero b:"; cin >> b; Iculo(int &a, int &b, int &c}{ } void sumazzescribir(int &a, int &b, int &e}{ cout <> a; cout <<" cin >> b; gresa numero b: "; } Void loop::calculo(int &, int &b, int &chf c=a*b; } void loop::escribir(int &a, int &b, int &c}f cout #include #include #include JIdeclaracion de clase para class Uno la clase base { protected: double a; public: ci6n miembro Uno(double = 2.0); // constructor miembro virtual double f1(double); // una fun virtual double 2(double); //otra funcion clase para UNO k /fimplementacion de ructor Uno::Uno(double val) // consti { aeval; na funci6n miembro } double Uno::f1(double num) // ul { return(num/2); (double num) // otra fun leva al cuadrado el resulta cin miembro } double Uno:f2 do de f1() { return( pow(fi(num),2) );/el } //decla racion de clase para fa clase derivada ‘lass Dos : public Uno { public: double fi(double); /festoanulaa f1() de la clase Uno i //implementacion de clase para Dos double Dos::f1(double num) uno fences © hido { U Por que (x hace Faldo return(num/3); iL lor mipmes me 1e9 } adele clare age int main() { char resp; do Uno objeto_1; je ijeto_1; // objeto_1 es un objeto de la clase base Dos objeto_2; // objeto_2 es un objeto de la clase derivada /f\lamaa f2() usando una llamada al objeto de la clase base cout << "El valor calculado usando una llamada a un objeto de clase ba << objeto_1.f2(12) << endl; objeto_1=objeto_2;//ANULACION, PERO NO FUNCIONA /filama a f2() usando una llamada al objeto de la clase derivada cout << "El valor calculado usando una llamada @ un objeto de la clase #include #include clase abskack finclude ee oe ee a /feeclaracion de clase para la clase base Ce) class Uno Fenctones vertoules { Peras protected: double 3; public: Uno{double = 2.0); // constructor virtual double fi(double); // una funcién miembro double f2(double); // otra funcién miembro /fimplementacién de clase para Uno Uno::Uno(double val) // constructor { azval; } double Unor:f1(double num) //una funcién miembro { return(num/2); //otra funcion miembro } double Unor:f2(double num) resultado de fal) { return( pow(ft(num),2) );//eleva al cuadrado el } , [jdectaracion de clase para la clase derivada class Dos : public Uno nula a f2() de la clase Uno i public: le f1(double); [festoal virtual doubl wntacion de clase para Dos 7 //fimpleme! -fa(double num) double Dos:: { return(num/3); } int main() { char resP; do { Uno objeto_ti, //objeto_1 es un objeto de la clase base Dos objeto_2; // ‘objeto_2 es un objeto de la clase derivada Nema a f2() usando una ‘lamada al objeto de la clase base cout << "El valor calculado usando una llamada a un objeto << objeto_1.£2(12) << endl; a) sando ura llamada al objeto de la clase derivada valor ealeulado usando una llamada 2 un objeto de la clase derivada es" #includecmath> #include #include /[declaracion de clase para la clase base class Uno protected: double a; public: Uno(double = 2.0); // constructor virtual double f1(double); // una funcién miembro double f2(double); // otra funcién miembro k /fimplementacién de clase para Uno ee val) // constructor azval; ) a 5 double Uno::f1(double num) // una funcién miembro { return(num/2); ) et double Uno::f2(double num) // otra funcion miembro. { return( pow(fi(num),2) ); // eleva al cuadrado el resultado de f1() } |{dectaracién de clase para la clase derivada class Dos : public Uno { public: ey double f1(double); // esto anula a fi() dela clase Uno “Por bevewrr f2(12) << endl; abjeto_1=objeto_2;//ANULACION 0 SOBRE-ESCRITURA /Mlama a £2() usando una llamada al objeto de la clase derivada cout << "El valor calculado usando una llamada a un objeto de la clase derivada es " <f2(12) << endl; do printf("\nContinuar S/ scanf("%6c" resp); fflush(stdin); resp=toupper(resp); Jwhile(regp [='S' && resp |='N'); Jwhile(resp-=="s % //Polimorfismo por anulacién y virtualizaciér #include #include class Cuadrado { protected: float la; public: virtual void Lectura(); virtual void Calculo(); virtual void Salida(); i void Cuadrado::Lectura() { cout<<"Lado:"; cin>>l; } void Cuadrado::Calculo() { a=l*l; } void Cuadrado::: { cout<<"Area del Cuadrado="<Lectura(); c->Calculo(); c->Salida(); c=t;//Anulacién o Sobre-escritura (objeto de la clase derivada anula al de la base) cout<<"Area del Triangulo"<Lectura(); c->Calculo(); Salida); system("pause"); Ejemplo 5: Polimorfismo por virtualizaciéi #include #include : FUNCIONA CON Y SIN VIRTUALIZACION jOJO!! ffvsing namespace std; class B {//L4&: public: _ virtual int fun(int x) {return x * yp //L5 virtua! i class Di:public B {// Clase derivada-1 public: : int fun (int x) {retum x* 10;} //L8 virtual i class D2:public B {/] Clase derivada-2 public: | int fun (int x) {return x* 15;}//L14 virtual he int main(void) { Bb; D1 di; D2 42; cout << “El valores ut << "El valor es: " << put finclude #includeciostream> //Clase abstracta class Figuras { public: float base; float altura; public: void captura(); virtual float perimetro()=0;//Métodos virtuales puros virtual float area()=0; //Métodos virtuales puros i class Rectangulo: public Figuras { public: void imprime(); float perimetro(){return 2*(base+altura);} float area(){return base*altura;} i class Triangulo: public Figuras { public: void muestra(); float perimetro(){return 2*altura+base;}//triangulo iséceles float area(){return (base*altura)/2;} k void Figuras::captura() { cout<<"CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISOCELES Y UN RECTANGULO:" <>altura; cout<<"escribe la base: "; cin>>base; k void Rectangulo::imprime() { cout<<"Perimetro="<>l; } void Cuadrado::Calculo() aal*l; } void Cuadrado::Salida() { cout<<"Area del Cuadrado="< #include #include Hinclude class Persona { protected: char nombre[30]; public: Persona(char *n) { strcpy(nombre, n); } void VerNombre() { cout << nombre << endl; } ke class Empleado : public Persona { public: Empleado(char *n) : Persona(n) {} void VerNombre() i << "Emp: "<< nombre << endl; } i class Estudiante : public Persona { public: Estudiante(char *n) : Persona(n) {} void VerNombre() cout << "Est: " << nombre << endl; } b int main() { char resp, name[30]; do { *cout<<’Nombre:”; cin.getline(name,30); Persona *Pepito = new Estudiante(name);*/. Persona *Pepito=new Estudiante("Jose"); Persona *Carlos = new Empleado("Charlie"); carlos >VerNombrety ido("Charlie"); Pepito->VerNombre(); delete Pepito; delete Carlos; do { printf("\nContinuar S/N:"); scanf("%c",&resp); fflush(stdin); resp=toupper(resp); }while(resp !='S' && resp !='N'); while(resp =='S'); return 0; } Para simplificar el cédigo, se ha utilizado memoria estatica en vez de dindmica. Evidentemente este es un error funcional grave puesto que el usuario de la clase puede provocar un fallo en la ejecucién haciendo un uso correcto de los métodos de interfaz. En cualquier caso, suponiendo que tenemos cuidado, la salida del programa, como es previsible serd la siguiente: Charlie Jose podemos comprobar que se ejecuta la versién de la funcién "VerNombre" que hemos definido para la clase base, y no la de las clases derivadas. Esto es debido a que la funcién que se ejecuta se resuelve en tiempo de EIECUCION atendiendo no al tipo de objeto apuntado, sino al tipo del apuntador. Si se utiliza virtualizacion se puede obtener el resultado deseado de hacer uso de la clase derivada. #include #include /}Minclude using namespace std; class Persona { public: Persona(char *n) { strepy(nombre, n); } virtual void VerNombre() { cout <<"Persona:"<< nombre << endl; } protected: char nombre[30]; i class Empleado :public Persona { public: Empleado(char *n) ; Persona(n) {} void VerNombre() { ; cout << "Emp: " << nombre << endl; ‘ class Estudiante : public Persona { public: Estudiante(char *n) : Persona(n) {} void VerNombre() { cout << "Est: "<< nombre << endl; } k int main() { Persona *Pepito = new Estudiante("Jose"); Persona *Carlos = new Empleado("Charlie"); Carlos->VerNombre(); Pepito->VerNombre(); delete Pepito; delete Carlos; system("pause"); return 0; O si se remplaza la parte del main por el siguiente cédigo se puede obtener algo equivalente al resultado anterior: int main() { char resp; do { Estudiante *Pepito=new Estudiante("Jose"); Empleado *Carlos=new Empleado("Charlie"); Carlos->VerNombre(); Pepito->VerNombre(); delete Pepito; delete Carlos; do { printf("\nContinuar S/N: scanf("%c",&resp); fflush(stdin); resp=toupper(resp); Jwhile(resp !='S' && resp JEN’); Jwhile(resp =='S'); return 0; } derivadas. Esto VerNombre superpuesto de las clases ie Las siguientes lineas de codigo son totalmente oneal por medio de punteros (remplazar en el main Entonces se ejecutara el método mismo sucede con las referencias. siendo el efecto andlogo al obtenido programa): int main() { char respi do { Estudiante Jose("Jost Persona &plose=JOse; plose.VerNombre(); Empleado Carlos("Charlis Persona &pCarlos=Carlos; pCarlos.verNombre(); do { printf("\nContinuar S/N"); scanf("%6c" resp); fflush(stdin); resp=toupper(resp); Jwhile(resp J="s' && resp I="! jwhile(resp ='S'); return 0; } Es decir, en este caso, atendiendo al recipiente y no a lo apuntado, lizard saa omnes ena funcién de an que Leet Sec engee coerercenc foe en reyes er © apunte. sin embargo, parece interesante qu ey eee eer lebe independientemente del recipient a a que se referencie o apunte. 2 en re i esuelve en tiempo de Gjecucién del programa, esto es, funcién de que clase Pertenece un objeto. Otro ejemplo de polimorfismo con virtualizacior Ejemplo 9: #include #include using namespace std; class Mascota { public: Mascota(string nombre, int patas); string hablar(); protected: virtual string palabra(); string nombre; int patas; k mientras se ejecuta, en Mascota::Mascota(string nombre, int patas):nombre(nombre),patas(patas) } string Mascota::palabra() { return "BUUU"; } string Mascota::hablar() { return nombre+" dice: “#this->palabra(); } class Perro : public Mascota { public: Perro(string nombre); cout << "Acaba de nacer tu mascota “<hablar() << endl; cout << g->hablar() << endl; cin.get(); return 0; }

You might also like