Publicado el 25 de Abril del 2018
640 visualizaciones desde el 25 de Abril del 2018
510,4 KB
8 paginas
Creado hace 22a (14/11/2001)
La herencia
La herencia
Recurso muy importante de los
Definir una nueva clase:
lenguajes P.O.O.
– como extensión de otra previamente
– sin modificar la ya existente.
definida.
La nueva clase hereda de la clase
anterior:
– las variables.
– las operaciones .
Principal objetivo/ventaja:
– Reutilización del código.
Ahorro de esfuerzo.
Mayor confianza en el código.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
51
La herencia en el mundo real.
La herencia. Tipos y subtipos
Tipo
Categoría
Subtipo
subcategoría
Animales
Mamíferos
Aves
Gatos
Leones
Águilas
Palomas
Organización jerárquica de categorías.
Relación es-un.
Relación supertipo-subtipo.
El conjunto de elementos que
pertenecen a un tipo incluye a los
elementos que pertenezcan a sus
subtipos.
Animales
Mamíferos
Aves
Leones
Palomas
Gatos
Águilas
Conjuntos anidados de objetos.
Relación entre tipos y subtipos.
Edificios
Motocicletas
Conjuntos disjuntos. No hay
relación de subtipado entre
estos tipos.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
52
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
53
La herencia. Tipos y subtipos.
La herencia en la P.O.O.
Principio de subtipos:
“Un objeto de un subtipo puede
aparecer en cualquier lugar donde se
espera que aparezca un objeto del
supertipo.”
– Los animales son capaces de moverse por
– Los mamíferos son capaces de moverse
– Las aves son capaces de moverse por sí
– Los gatos son capaces de moverse por sí
por sí mismos.
sí mismos.
mismas.
mismos.
A la inversa no es cierto.
– Los gatos maullan.
– Los mamíferos maullan.
– Los animales maullan.
Clase base
superclase, padre
Clase derivada
subclase, hija
Empleado
Empleado de
producción
Empleado
comercial
Empleado
Empleado
de
producción
Empleado
comerciales
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
54
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
55
La herencia en la P.O.O.
Herencia de métodos y variables.
El principio de los subtipos también
Una función que recibe un objeto de
se cumple en la P.O.O.
la clase base.
void Despedir ( empleado);
Puede recibir objetos de la clase
base y también de sus derivadas.
empleado e;
empleado_producción ep;
empleado_comerciales ec;
Despedir (e);
Despedir (ep);
Despedir (ec);
Clase
empleado
Nombre
DNI
Sueldo fijo
Cambiar_Sueldo();
Clase
empleado
producción
Num_Piezas
Pts_Pieza
Calcular_Sueldo();
Clase
empleado
comercial
Pts_vendidas
Calcular_Sueldo();
Las clases derivadas reciben las
variables y métodos de la clase base.
Empleado_comercial ec;
Empleado_produccion ep;
ec.Cambiar_Sueldo();
ep.Cambiar_Sueldo();
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
56
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
57
Composición y herencia
Ejemplos de composición y herencia
Composición:
Relación tener-un
Un coche tiene un tipo de motor
Composición significa contener un objeto.
Motor
Coche
class coche
{ ...
private:
Motor _motor;
};
Herencia:
Relación ser-un
Un coche es un vehículo
Herencia significa contener una clase.
Coches
Autobuses
Vehículos
class coche: vehiculo
– Herencia: un empleado es una persona.
Clase persona y clase empleado.
Clase persona y clase domicilio.
– Composición: una persona tiene un
domicilio.
Clase lista y clase nodo de la lista:
– Composición: una lista tiene un puntero
de tipo nodo al nodo que está en cabeza
de la lista (tener-un).
es un empleado.
Clase empresa, clase empleado y
clase jefe de grupo de empleados.
– Herencia entre empleado y jefe: Un jefe
– Composición entre empresa y empleado o
jefe.
Una empresa puede tener una lista de
empleados y otra de jefes.
Por el principio de los subtipos, una
empresa puede tener una única lista
donde aparezcan tanto jefes como
empleados.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
58
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
59
La herencia en C++
La herencia en C++
Clase Empleado
Clase Empleado
de Producción
Clase Empleado
Comercial
class empleado
{
char nombre[30];
char DNI[9];
long int sueldo;
public:
void CambiarSueldo(long int v);
long int SueldoBase(void)
{ return sueldo; }
};
class empleado_produccion: public empleado
{
int num_piezas;
int ptas_pieza;
public:
long int CalcularSueldo(void);
};
class empleado_comercial: public empleado
{
int ptas_vendidas;
public:
long int CalcularSueldo(void);
};
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
60
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
61
La herencia en C++
La herencia en C++
long int
empleado_produccion::CalcularSueldo(void)
{
return( SueldoBase() +
num_piezas * ptas_pieza );
}
Equivale a:
empleado::SueldoBase()
Los miembros de la clase empleado se pueden
utilizar en las clases derivadas tal y como si
hubiesen sido definidos en éstas
Método de la clase base
empleado::CambiarSueldo()
void main(void)
{ empleado_produccion ep;
ep.CambiarSueldo(100000);
cout << “El sueldo es “
<< ep.CalcularSueldo();
}
Modos de acceso
– private
Lo que es private en la clase base no
es accesible en la clase derivada.
– public
– protected
Lo que definimos como public es
accesible desde cualquier parte.
Lo que definimos como protected en
la clase base:
– es accesible en la clases
derivadas,
– pero no es accesible desde fuera
de las clases derivadas o base.
public
protected
private
Clase
derivada
Accesible Accesible
Fuera
Accesible
No
Accesible
No
Accesible
No
Accesible
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
62
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
63
Tipos de herencia
La herencia en C++
– class <clase_derivada>:<tipo> <clase_base>
– public:
los modos de acceso a los miembros de
la clase base se quedan igual en la clase
derivada.
– protected:
Los miembros “public” de la clase base
pasan a ser “protected”.
El resto se queda igual.
– private:
Todos los miembros de la clase base
pasan a ser “private” en la derivada.
class padre
{ int x;
public:
void Sx(int v) { x=v; }
};
class hija: protected padre
{ int h;
public:
void SetX(int v)
void main(void)
{ hija h;
// h.Sx(5);
// no permitido
h.SetX(5);
}
{ // x=v; no permitido
Sx(v); }
};
Redefinición de miembros
A veces, interesa cambiar en la
subclase la definición de algo
que está en la clase base.
class base
{
protected:
int v;
public:
void Sv(int val) { v=val; }
};
class derivada: public base
{ char v[30]; // re-definición v
public:
void Sv(int val) // re-definición
Sv()
{ itoa(val,10,v); }
};
Lo redefinido no desaparece.
derivada d;
d.base::Sv(5);
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
64
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
65
La herencia en C++
Herencia múltiple
Ejemplo re-definición de métodos
class empleado
{ char nombre[30];
int ptas_hora;
int num_horas;
public:
Clase Empleado
void AsignarNombre(char *nom) {...}
void AsignarHorasPtas(int ptas,
int horas) {...}
int Sueldo(void)
{ return ( ptas_hora * num_horas );
}
};
class empleado_comercial: public empleado
{ int ptas_km;
Clase Empleado
Comercial
int num_km;
public:
void DietasPtas(int ptas,int km) {...}
int Sueldo(void)
{ return ( empleado::Sueldo() +
ptas_km * num_km );
}
}
Sino, sería una llamada recursiva a
empleado_comercial::Sueldo()
– Una clase derivada hereda las
características de más de una clase base.
MATERIAL
ELÉCTRICO
tensión
potencia
ACUMULADOR
ELÉCTRICO
capacidad_carga
Herencia múltiple
COCHE ELÉCTRICO
autonomía
MEDIO DE
TRANSPORTE
velocidad_limite
precio
COCHE
número de puertas
color
COCHE DIESEL
tipo_inyector
COCHE GASOLINA
número_bujías
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
66
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
67
Herencia múltiple en C++
class empleado
{ ...
class comercial
{
int ptas_km;
int num_km;
public:
...
int Sueldo(void);
public:
...
int Sueldo(void)
};
Herencia múltiple
{ return (ptas_km
* num_km);
}
}
class empleado_comercial: public empleado,
public comercial
{
public:
int Sueldo(void)
{ return ( empleado::Sueldo() +
comercial::Sueldo() );
}
}
La herencia en C++
Constructores y destructores en la
herencia:
– Construcción objeto clase derivada:
Primero se construye la parte
heredada de la clase(s) base.
– Se ejecutan constructores de las
clases base.
Por último se ejecuta el código del
constructor de la clase derivada.
– Destrucción objeto clase derivada:
el proceso es a la inversa que en la
construcción.
Se ejecuta primero el destructor de
la clase derivada,
y a continuación los de las clases
base.
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
68
Lenguaje C++. Leng. Prog. II. Filiberto Pla y Jorge Badenas.
69
La herencia en C++
– Ejemplo (Constructores y destructores en
la herencia):
class base1
{ public:
base1(void) { cout << “base1”; }
˜base1(void) { cout << “base1 D”; }
}
class base2
{ public:
base2(void) { cout << “base2”; }
˜base2(void) { cout << “base2 D”; }
}
class derivada: public base1, public base2
{ public:
derivada(void) { cout << “derivada”; }
˜derivada(void) { cout<< “derivada D”;}
}
void main(void)
{ derivada d;
}
base1
base2
derivada
derivada D
base2 D
base1 D
La herencia en C++
Constru
Comentarios de: C++ Herencia (0)
No hay comentarios