Publicado el 22 de Mayo del 2018
300 visualizaciones desde el 22 de Mayo del 2018
411,8 KB
7 paginas
Creado hace 22a (21/11/2001)
El polimorfismo
Polimorfismo
El polimorfismo se refiere al hecho
de que una misma función adopte
múltiples formas.
Esto se consigue por medio de la
sobrecarga:
– Sobrecarga de funciones:
un mismo nombre de función para
distintas funciones.
a = Sumar(c,d);
a = Sumar(c,d,5);
– Sobrecarga de operadores:
un mismo operador con distintas
funcionalidades.
entero1 = entero2 + 5;
cadena1 = cadena2 + cadena3;
Podemos sobrecargar el operador +
sobre la clase cadena para que
permita concatenar dos de estos
objetos.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
82
Sobrecarga de constructores
Sobrecarga de funciones
class ejemplo
{ int x;
public:
ejemplo(void) { x = 10; }
ejemplo(int i) { x = i; }
ejemplo(int i,int j) { x = i+j; }
};
llamada a
ej1.ejemplo(void)
llamada a
ej2.ejemplo(int)
void f(void)
{ ejemplo ej1;
ejemplo ej2=5;
ejemplo ej3(5,6);
...
}
llamada a
ej3.ejemplo(int,int)
Recordatorio:
– Solo en caso de que no definamos ningún
constructor tenemos el constructor por
defecto.
class string
{ char *v;
int tam;
public:
string(void);
string(string & s);
friend int strcmp(string s1,string s2);
friend int strcmp(string s1, char *c);
friend int strcmp(char *c,string s1);
string strcpy(string s);
string strcpy(char *c);
};
Tenemos 2 funciones costructor string().
Tenemos 4 posibles llamadas a 4 funciones
diferentes strcmp():
– 3 en la clase.
– 1 en la librería string.h de C.
Tenemos 2 funciones strcpy() en la clase.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
83
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
84
Sobrecarga de funciones
Sobrecarga de funciones
void main(void)
{ string s1,s2;
char c1[30],c2[30];
...
strcmp(s1,s2); // Compara las cadenas de
// dos objetos string.
strcmp(s1,c1); // Compara un objeto
// string y una cadena de
// caracteres.
strcmp(c1,s1); // Viceversa que anterior
strcmp(c1,c2); // Compara dos cadenas de
// caracteres
s1.strcpy(s2); // Copia un objeto string
// s2 a un objeto string
// s1
s1.strcpy(c1); // Copia la cadena c1 al
// objeto string s1.
}
En la sobrecarga de funciones se desarrollan
distintas funciones con un mismo nombre
pero distinto código.
Las funciones que comparten un mismo
nombre deben tener una relación en cuanto a
su funcionalidad.
Aunque comparten el mismo nombre, deben
tener distintos parámetros. Éstos pueden
diferir en :
– El número
– El tipo
– El orden
de manera que el compilador pueda distinguir
entre las distintas funciones cuando
encuentra una llamada.
El tipo del valor de retorno de una función
no es válido como distinción.
– Esto es debido a que ese valor en C++ no
es necesario que sea recogido por otro
objeto.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
85
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
86
Ejemplo de sobrecarga de funciones
void concatenar(char *, char *);
void concatenar(char *,char *,char *);
void concatenar(char *,int);
void main(void)
{ char v1[50]=“1”;
char v2[30]=“2” ;
int val=3;
char v3[10]=“4”;
concatenar(v1,v2);
concatenar(v1,v2,v3);
concatenar(v1,val);
}
void concatenar(char *s1,char *s2)
{ strcat(s1,s2); }
void concatenar(char *s1,char *s2,char *s3)
{ strcat(s1,s2);
strcat(s1,s3);
}
void concatenar (char *s1,int v)
{ char cadena[50];
itoa(v,10,cadena);
strcat(s1,cadena);
}
Sobrecarga de operadores
Consiste en definir nuevas
funcionalidades para los operadores
definidos en el lenguaje.
– Por ejemplo:
string s1,s2;
string s3=s1+s2;
concatenación de dos
objetos string
mediante el operador +
Se pueden sobrecargar prácticamente
todos los operadores del lenguaje:
– No podemos inventar nuevos operadores.
int a; X x;
x**a ; // NO es posible
Los operadores son de distinta aridad:
unarios ++, --, -, ...
binarios +, -, *, %
ternarios ?:
Tampoco podemos cambiar su aridad:
%a; // NO es posible
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
87
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
88
Sobrecarga de operadores
No podemos re-definir funcionalidades
de los operadores que ya están
definidas:
int a=0;
a++;
No puedo cambiarlo para
que haga otra cosa distinta
a incrementar el valor de
un entero.
Al menos uno de los operandos del
operador sobrecargado debe ser una
clase definida por nosotros:
– Ejemplo:
No puedo re-definir la suma de dos
enteros, o la concatenación con el
operador + de dos char *.
Si que puedo definir la concatenación
de un objeto string con un char *,
porque la clase string la definimos
nosotros.
Sobrecarga de operadores
La sobrecarga de operadores es un
caso particular de la sobrecarga de
funciones:
a+b operator+(a,b)
a.operator+(b)
equivale a ...
– El operando de la izquierda puede pasar a
– el primer argumento de la función.
ser el propietario de la función, o bien
Función operator miembro:
class A
{ public:
A operator+(A b);
};
A A::operator+(A b)
{ ... }
Función operator no miembro de
una clase:
A operator+(A a,A b)
{ ... }
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
89
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
90
Sobrecarga de operadores
class A
{ int x;
public:
Se define como “friend”
A(void) { x=10; }
A operator+(A a);
A operator+(int i);
friend A operator(int i,A a);
};
A A::operator+(A a)
{ A tmp;
tmp.x = x+a.x;
return tmp;
}
A A::operator+(int i)
{ A tmp;
tmp.x = x+i;
return(tmp);
}
A operator+(int i,A a)
{ A tmp;
tmp.x= a.x+i;
return(tmp);
}
void main(void)
{ int k=3;
A c;
A d;
c=c+d;
c=d+k;
c=k+d;
}
void main(void)
{ int k=3;
A c;
A d;
c=c.operator+(d);
c=d.operator+(k);
c=operator+(k,d);
}
El operador asignación
Para cualquier clase que se defina, el
compilador define el operador asignación “=“.
class A
{ int a;
public: ...
};
A c,d;
c=d;
Se puede hacer sin definir
operator= El resultado es la
copia del valor d.a en c.a
Cuando no me sirve, debo re-definirlo:
class B
{ int tam;
Normalmente, tenemos que
definirlo cuando necesitamos
definir el constructor copia
int *buffer;
public:
B(B &);
~B(void);
B operator=(B);
}
B B::operator=(B b)
{ if (tam>0) delete buffer;
tam=b.tam;
buffer=new int[tam];
for(int i=0; i<tam; i++)
buffer[i]=b.buffer[i];
return(*this);
}
Esto permite
hacer:
a=b=c;
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
91
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
92
El operador
incremento y el decremento
Tiene dos posibles notaciones:
– prefija:
– postfija:
++a
a++
class X
{ int i;
public:
X operator++(void); // pre-incremento
X operator++(int); // post-incremento
}
X X::operator++(void)
{ i++;
return(*this);
}
X X::operator++(int)
{ int aux=i;
i++;
return(aux);
}
Lo incrementamos ya
pero se utiliza el valor
antes de incrementar
en la expresión donde
se encuentre:
a=(b++);
// a=b.operator++();
c=b; // c es a+1
Uso de referencias
en sobrecarga de operadores
Devolución de una referencia:
– Se debe devolver una referencia cuando:
queremos que se pueda modificar el
propio objeto que se devuelve.
– Ejemplo: el operador subíndice.
class V
{ int vector[30];
public:
int & operator[](int j);
};
int & V::operator[](int j)
{ return vector[j]; }
void main(void)
{ int k;
Para este caso NO hace
falta la referencia.
V v;
...
k=v[5];
v[5]=k;
}
Para este caso SI que es
necesaria la referencia.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
93
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
94
El operador subíndice
Índices dobles:
class linea
{ int ln[10];
public:
int & operator[](int j)
{ return ln[i]; }
};
class matriz
{ linea mat[10];
public:
linea & operator[](int j)
};
void main(void)
{ matriz m;
int i;
i=m[5][5];
m[5][5]=i;
}
{ return mat[j]; }
m[5] devuelve el objeto
linea que está en la
posición 5 de mat.
m[5][5] devuelve el entero
que está en la posición 5
del vector ln que contiene
el objeto linea que está en la
posición 5 dela matriz mat.
Conversión de
clases mediante constructores
class X
{ ...
}
class Y
{ ...
public :
y ( X x ) {....}
...
}
Un constructor Y::Y( X x) permite al
compilador convertir objetos de la clase X
en objetos de la clase Y.
Este constructor permite :
X x;
Y y=x;
Void f(Y y);
...
X x;
f(x);
1. Construye un objeto Y a partir de un
objeto X.
2. Donde se requiere un objeto de la clase
Y se puede suministrar un objeto de la
clase X, pues el objeto de la clase X es
convertido en un objeto de la clase Y.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
95
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
96
Ejemplo. Conversión de clases
Operadores de conversión
class complejo
{ float real;
float imaginaria;
public:
complejo(float a,float b)
{ real=a; imaginaria=b; }
complejo(float a=0.0)
{ real=a; imaginaria=0.0; }
friend complejo
operator+(complejo,complejo);
operator=(complejo);
};
complejo operator+(complejo a,complejo b)
{ complejo c;
c.real=a.real+b.real;
c.imaginaria=a.imaginaria +b.imaginaria;
return c;
}
void main(void)
{ complejo c1;
complejo c2(1.5,2.3);
float f ;
c1= c2 + f; //operator+(c2,complejo(f));
c2= f + c1; //operator+(complejo(f),(1);
c1= f + 5; //c1.operator=(complejo(f+5));
}
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
97
Los constructores de una clase X:
ser convertidas en la clase X.
– permiten definir qué otras clases pueden
Los operadores de conversión que se
definen en una clase X:
– permiten definir
Comentarios de: El polimorfismo (0)
No hay comentarios