El documento describe los conceptos de herencia y polimorfismo en programación orientada a objetos. La herencia permite crear nuevas clases a partir de clases existentes adoptando sus atributos y mejorándolos. El polimorfismo permite que diferentes objetos respondan de forma diferente a los mismos mensajes o operaciones. Se proveen ejemplos de herencia simple y sobrecarga de operadores como ilustración de estos conceptos.
2. La
herencia
es
una
forma
de
reutilización
del
software
en
la
que
se
crean
nuevas
clases
a
partir
de
clases
ya
existentes.
Las
nuevas
clases
se
crean
por
medio
de
la
adopción
de
los
atributos
de
las
clases
existentes,
adaptándolos
o
mejorándolos
con
capacidades
que
las
nuevas
clases
requieran.
Definición
3. Ventajas
• La
herencia
es
una
la
relación
existente
entre
dos
clases,
• Se
reduce
la
cantidad
de
código
en
cada
clase,
• Permite
definir
nuevas
clases
utilizando
como
base
clases
ya
existentes,
• Esta
es
una
herramienta
poderosa
que
sirve
para
producir
software
confiable,
de
bajo
costo
y
reutilizable.
4. De
la
que
se
hereda La
que
hereda
Superclase Subclase
Clase
Padre Clase
hijo
Clase
Base
Clase
Derivada
La
herencia
se
apoya
en
el
significado
de
ese
concepto
en
la
vida
diaria. Así,
las
clases
básicas (base
class) o
fundamentales
se
dividen
en
subclases (derived class).
Terminología
5. Herencia
Simple
Circulo
Esfera cilindro
R
R
R
Característica
común:
Radio
El
circulo:
La
clase
base
El
cilindro
y
la
esfera:
Las
clases
derivadas
El
principio
en
que
se
basa
la
división
de
clases
es
la
jerarquía,
compartiendo
características
comunes.
Las
flechas
apuntan
de
la
clase
derivada
a
la
clase
base.
6. ¿Cómo
derivar
una
clase
a
partir
de
otra?
Una
clase
derivada
tiene
la
forma
que
cualquier
otra
clase
en
cuanto
que
consta
de
una
declaración
y
una
implementación.
La
diferencia
estriba
en
la
primera
línea
de
la
sección
declaratoria.
Para
una
clase
derivada
dicha
línea
se
extiende
para
incluir
una
especificación
de
acceso
y
un
nombre
de
la
clase
base
y
en
la
siguiente
forma:
class nombreClase
: acceso-‐a-‐clase nombreClaseBase
class Cilindro
:
public Circulo
{
//aquí
se
agrega
cualquier
dato
adicional
y
los
miembros
función
};
Private, Public , Protected
7. Acceso
a
Clase
public,
protected y
private
La
clase
base
podría
heredar
a
través
de
herencia
public,
protected o
private,
el
uso
de
la
herencia
protected y
private es
raro
y
deben
utilizarse
con
mucho
cuidado;
por
lo
general
se
utiliza
la
herencia
public.
8. Significa
que
una
clase
derivada
tiene
acceso
a
los
elementos
públicos
y
protegido
de
su
clase
base,
la
herencia
publica
se
representa
con
el
especificador
class clasederivada
:
public clasebase
{
public:
//
Sección
publica
private:
//
Sección
privada
};
Herencia
public
9. Polimorfismo
• Una
de
las
características
más
importantes
de
la
programación
orientada
a
objetos
es
la
capacidad
de
que
diferentes
objetos
responden
a
órdenes
similares
de
modo
diferentes.
• Identificador
de
mensaje
y
operadores
sobrecargados.
• El
identificador
de
mensaje
y
operador
invocan
una
operación
específica
sobre
un
objeto.
• Cada
uno
establece
la
selección
del
significado
uniforme
de
la
operación
en
particular
que
se
desea
realizar.
• En
términos
generales,
Polimorfismo se
define
como
la
calidad
o
estado
de
ser
capaz
de
asumir
formas
diferentes.
10. Polimorfismo
(Ejemplo
Sobrecarga)
class complejo
//Nombre
de
la
clase
{
public :
complejo(
double =
0.0,
double =
0.0
);
//Constructor
complejo
operator
+ (
const complejo
&
)
const;
//Sobrecarga
private:
double real,
imaginario;
};
complejo::complejo(
double a,
double b
)
//
Constructor
de
la
clase
{
real
=
a;
imaginario
=
b;
}
complejo
complejo::operator
+ (const complejo
&a)
const
{
complejo
c;
//Define
un
objeto
complejo
c.real
=
real
+
a.real;
//Define
de
la
operación
llevada
a
cabo
por
el
operador
c.imaginario
=
imaginario+a.imaginario;
return c;
//Retorno
del
valor
adquirido }
Donde se sobrecarga el operador es
donde se aplica el polimorfismo.
11. Ejemplo
de
Herencia
Simple
class Barco
{
protected: char*
nombre;
float
peso;
public: //Constructores
y
demás
funciones
básicas
de
Barco.
};
class Carguero:
public
Barco
//
Se
especifica
que
hereda
de
Barco.
{
private: float
carga;
//faltaría
el
resto
de
cosas
};
class
Acorazado:
public Barco
{
private: int
numeroArmas;
int
Soldados;
//
El
resto
de
cosas
};
13. #include ”Figura.h”
class Punto :
public Figura {
public:
Punto(int =
0,
int =
0);
void establecerX(int);
int obtenerX()
const;
void establecerY(int);
int obtenerY()
const;
virtual string obtenerNombre()
const;
virtual void imprimir()
const;
private:
int x;
int y;
};
Clase
Punto
(Hereda
de
Figura)
14. Punto::Punto(int valorX,
int valorY)
:
x(valorX),
y(valorY) {
}
void Punto::establecerX(int valorX)
{
x
=
valorX;
}
int Punto::obtenerX()
const
{
return x;
}
void Punto::establecerY(int valorY)
{
y
=
valorY;
}
int Punto::obtenerY()
const
{
return y;
}
string Punto::obtenerNombre()
const
{
return "Punto";
}
void Punto::imprimir()
const
{
cout<<"["<<obtenerX()<<",
"<<obtenerY()<<"]";
}
Clase
Punto
15. #include "Punto.h”
class Circulo:
public Punto {
public:
Circulo(int =
0,
int =
0,
double =
0.0);
void establecerRadio(double);
double obtenerRadio()
const;
double obtenerDiametro()
const;
double obtenerCircunferencia()
const;
virtual double obtenerArea()
const;
virtual string obtenerNombre()
const;
virtual void imprimir()
const;
private:
double radio;
};
Clase
Circulo
(Hereda
de
Punto)
21. #include "Cilindro.h"
int main()
{
Punto punto1(7,
11);
Circulo circulo1(22,
8,
3.5);
Cilindro cilindro1(10,
10,
3.3,
10);
cout<<punto1.obtenerNombre()<<":
";
punto1.imprimir();
cout<<"nn";
cout<<circulo1.obtenerNombre()<<":
";
circulo1.imprimir();
cout<<"nn";
cout<<cilindro1.obtenerNombre()<<":
";
cilindro1.imprimir();
cout<<"nn";
return 0;
}
Un
ejemplo
de
ejecutable
22. #include <vector>
#include "Cilindro.h"
void virtualViaApuntador(const Figura
*);
void virtualViaReferencia(const Figura
&);
int main()
{
Punto punto1(7,
11);
Circulo circulo1(22,
8,
3.5);
Cilindro cilindro1(10,
10,
3.3,
10);
/*Crear
vector
de
tres
apuntadores
de
la
clase
base*/
vector
<Figura
*>
figuraVector(3);
figuraVector[0]
=
&punto1;
figuraVector[1]
=
&circulo1;
figuraVector[2]
=
&cilindro1;
Otro
ejemplo
de
ejecutable
23. cout<<"nLLAMADAS A
FUNCIONES
VIRTUALES";
cout<<"nMEDIANTE APUNTADORES
DE
LA
CLASE
BASEnn";
for(int i
=
0;
i
<
figuraVector.size();
i++)
virtualViaApuntador(figuraVector[i]);
cout<<"nLLAMADAS A
FUNCIONES
VIRTUALES";
cout<<"nMEDIANTE REFERENCIAS
DE
LA
CLASE
BASEnn";
for(int j
=
0;
j
<
figuraVector.size();
j++)
virtualViaReferencia(*figuraVector[j]);
return 0;
}