Este documento describe herramientas de polimorfismo y herencia en C++, incluyendo sobrecarga de operadores y funciones, uso de plantillas, manejo de parámetros dinámicos, y conceptos de herencia como clases abstractas y métodos virtuales.
2. Agenda
• Sobrecarga de operadores en C++.
• Uso de plantillas (templates) en C++.
• Manejo congruente de parámetros con
objetos dinámicos y atributos dinámicos.
• Herencia en C++: Definición, clases
abstractas y métodos virtuales. 2
3. Sobrecarga de operadores en C++
• La sobrecarga de operadores es una forma
más de polimorfismo.
• La sobrecarga de operadores permite
definir para una clase un método especial,
por ejemplo la clase string sobre carga el
operador + para concatenar cadenas.
3
4. Sobrecarga de operadores
• Los operadores que se pueden sobrecargar
son: +, -, *, /, %, ^, &, |, _, ', =, <, >, <=,
>=, ++, --, <<, >>, ==, %%, ||, +=, -=, *=,
/=, %=, &=, |=, <<=, >>=, [ ], ( ), ->, ->*,
new, delete
• Los operadores que no se pueden
sobrecargar son: ., ::, ?:, sizeof
4
5. Sobrecarga de Operadores
• Existen algunos operadores como el = que
ya se encuentran sobrecargados de manera
nativa. En el caso del = compara objetos
en base a sus referencias.
• Antes de ver la sobrecarga de operadores
se verá la sobrecarga de funciones para
entender el concepto.
5
6. Sobrecarga de funciones
• Un método o función se dice que está
sobrecargado cuando para el mismo
identificador se pueden realizar dos o más
funciones. Por ejemplo:
int suma(int a, int b) {
return a+b;
} 6
7. Sobrecarga de funciones
double suma(double a, double b) {
return a+b;
}
• Se puede invocar la función suma de dos
formas distintas:
• int c = suma(10, 3);
• double d = suma(10.3, 5.1); 7
8. Sobrecarga de operadores
• La única restricción de la sobrecarga de
operadores es que no se puede cambiar la
aridad de los operadores; es decir, si el +
es binario, se sigue manejando de la misma
forma.
• Complex& Complex::operator[](unsigned
int i) { return data[i]; }
8
9. Sobrecarga de operadores
class Vector {
public:
float x, y;
Vector operator+ (Vector v) {
Vector resultado;
resultado.x = x + v.x;
resultado.y = y + v.y;
return resultado;
}
}; 9
10. Sobrecarga de operadores en Java
• Java no soporta sobrecarga de operadores.
Los únicos casos de operadores
sobrecargados con una operación especial
(definido por el sistema no por los
programadores) son el operador = para
copia, para == igualdad de referencias y +
para la concatenación de cadenas o
elementos.
10
11. Uso de plantillas (templates) en C++
• Las plantillas nos permite hacer genéricos
los tipos de datos abstractos; es decir, nos
permiten definir una clase que funcione
con cualquier tipo de datos, por ejemplo
una lista puede ser de cualquier cosa.
• template <class tipo_dato>
• class clase { …… };
11
12. Plantillas
int max(int x, int y) {
return (x < y) ? y : x;
}
float max(float x, float y) {
return (x < y) ? y : x;
}
12
13. Plantillas
template <typename T>
T max(T x, T y) {
return (x < y) ? y : x;
}
• Cuando se trata de funciones no hay
diferencia entre los atributos typename y
class 13
14. Plantillas
• Los objetos parametrizados se crean con:
una_clase<int> x;
• Java permite genericidad pero es mucho
más básica que en C++.
public interface Iterator<E> { E next();
boolean hasNext(); } 14
15. Manejo congruente de parámetros
con objetos dinámicos y atributos
dinámicos
• Se debe tener mucho cuidado al momento
de crear objetos de manera dinámica que a
su vez reciba como argumentos atributos
también dinámicos.
• Se debe limpiar de la memoria todos los
objetos que no se necesiten.
15
16. Herencia en C++: Definición, clases
abstractas y métodos virtuales
• La herencia es un mecanismo que permite
la reutilización de componentes. Se basa
en el principio de que los objetos en la
vida real heredan ciertos atributos y
comportamientos de sus padres.
• La herencia en C++ puede ser múltiple.
16
19. Clases Abstractas
• Son aquellas clases que sólo sirven para
hacer generalización; es decir, sirven de
clase base más no se instancian objetos de
dicha clase.
• Las clases abstractas son el equivalente a
las interfaces en Java.
19
20. Métodos Virtuales
• Son los métodos que se definen en las
clases abstractas y que se implementan en
cada clase hija.
• Los métodos virtuales se caracterizan por
que se ligan en memoria; es decir, se
mandan llamar desde un puntero a la clase
abstracta y de manera dinámica se ejecuta
el método que corresponde al objeto
actual. 20