Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Herencia3 PDF
Herencia3 PDF
CONTENIDOS
1. Completar el ejemplo de Herencia:
Superclase Persona-Subclase Alumno
2. Redefinicin de mtodos.
3. Jerarqua de clases.
4. Ejecucin de los pasos de mensajes con Herencia.
5. Problemas con la vinculacin de mensajes.
6. Funciones virtuales.
7. Clases Abstractas.
Herencia (III)
Ejemplo de Herencia
Class Alumno : public Persona
{
private:
int curso;
public:
Alumno(char * , int = 0, char *, char * , int );
Alumno& operator=( Alumno &);
~Alumno ();
// Destructor
int mcurso ();
void mcurso (int );
};
class Persona
{
private:
char * nif;
int edad;
char * nombre, *apellidos;
public:
Persona(char * , int = 0, char *, char * );
Persona & operator=( Persona &);
~Persona();
// Destructor
void medad(int);
void mnombre(char *);
char * mnombre() ;
void mostrar() ;
char * nombreCompleto() ;
void felizCumple();
// El da del cumpleaos
void leer();
// Lectura de los datos de la persona
};
Clase Persona
Clase Alumno
Herencia (III)
Ejemplo de Herencia: implementacin de los mtodos
Class Alumno : public Persona
{
private:
int curso;
public:
Alumno(char * , int = 0, char *, char * , int );
Alumno& operator=( Alumno &);
~Alumno ();
// Destructor
int mcurso ();
void mcurso (int );
};
Alumno :: Alumno (char * n, int e, char * nom, char * ape , int c ) : Persona (n, e, nom, ape)
{
curso = c;
}
Herencia (III)
Ejemplo de Herencia : Implementacin de los mtodos
Herencia (III)
Cmo quedan las clases?
Clase persona
Clase Persona
Clase Alumno
nif
nombre
apellidos
edad
nif
nombre
apellidos
edad
medad( )
mnombre( )
mostrar( )
nombreCompleto( )
felizCumple( )
leer( )
medad( )
mnombre( )
mostrar( )
nombreCompleto( )
felizCumple( )
leer( )
Clase Alumno
Heredado
curso
mcurso( )
Aparte de
constructores,
destructor y
operador de
asignacin
Herencia (III)
Redefinicin de mtodos
En la clase derivada se puede redefinir algn mtodo ya definido en la
clase base: redefinicin o superposicin de mtodos.
Para redefinir un mtodo en la subclase, basta con declarar una funcin
miembro con el mismo nombre.
El mtodo mostrar() no resulta adecuado para
Alumno, ya que no muestra el curso del alumno.
class Persona
{
private:
...
public:
Persona(char * , int = 0, char *, char * );
.
void mostrar() ;
.
};
Herencia (III)
Redefinicin de mtodos
Tenemos definido un mtodo mostrar() para la clase Alumno, y ser
ste el que se ejecute cuando se le pase el mensaje mostrar a un objeto
de la clase Alumno.
void Persona :: mostrar()
{
cout << nif;
cout << Nombre: << nombre;
}
Herencia (III)
Prueba de la clase Alumno y Persona
Alumno :: Alumno (char * n, int e, char * nom, char * ape , int c ) : Persona (n, e, nom, ape)
{
curso = c;
}
void main()
{
Persona p1(89411N, 33, Luis, Fernan);
alum
p1
77777R
nif
89411N
33
Luis
nif
edad
nombre
Fernan apellido
20
Ana
edad
nombre
Ruiz apellido
3 curso
Herencia (III)
Prueba de la clase Alumno y Persona
void Persona :: mostrar()
{
cout << nif;
cout << Nombre: << nombre;
}
void main()
{
Persona p1(89411N, 33, Luis, Fernan);
Alumno alum (77777R, 20, Ana , Ruiz, 3 );
p1.mostrar( );
alum .mostrar( ) ;
alum
p1
89411N
33
Luis
77777R
nif
20
edad
Ana
nombre
edad
nombre
Ruiz apellido
Fernan apellido
3 curso
Herencia (III)
Jerarqua de Clases
A medida que se establecen relaciones de herencia entre clases, se va
construyendo la jerarqua de clases del sistema.
Persona
Alumno
Ingeniero
Tcnico
Diagrama UML
10
Secretarias
Profesor
Asociado
Permanente
Doctor
nif
Licenciado
Herencia (III)
Jerarqua de clases
Cunto ms arriba en la
jerarqua, menor nivel de
detalle.
Clase ms general
Persona
Alumno
Ingeniero
Secretarias
Tcnico
Profesor
Asociado
Permanente
Doctor
Licenciado
11
Herencia (III)
Ejecucin de los pasos de mensajes con Herencia
Cuando a un objeto se le pasa un mensaje:
Se busca en la clase de
ese objeto el mtodo
correspondiente
SI
Existe ??
FIN
NO
Se busca en la
superclase inmediata
Existe ??
SI
NO
SI
Subiendo en la
jerarqua hay ms
clases?
NO
ERROR !!
12
Herencia (III)
Ejecucin de los pasos de mensajes con Herencia
void Persona :: mostrar()
{
cout << nif;
cout << Nombre: << nombre;
}
void main()
{
Alumno alum (77777R, 20, Ana , Ruiz, 3 );
alum . mostrar( ) ;
}
Herencia (III)
Ejecucin de los pasos de mensajes con Herencia
void main()
class Persona
{
{
Alumno alum (77777R, 20, Ana , Ruiz, 3 );
private:
alum . felizCumple( ) ;
char * nif;
}
int edad;
char * nombre, *apellidos;
public:
El mtodo felizCumple( ) NO
.
void mostrar() ;
est definido en la clase
char * nombreCompleto() ;
Alumno, por lo que se busca en
void felizCumple();
// El da del cumpleaos
void leer();
la superclase (Persona), se
};
Herencia (III)
Ejecucin de los pasos de mensajes con Herencia
void main()
{
Alumno alum (77777R, 20, Ana , Ruiz, 3 );
alum . pasarCurso( ) ;
}
Herencia (III)
Tipos de vinculacin
Vinculacin esttica: se trata del intento de vincular el
mensaje con el mtodo correspondiente en tiempo de
compilacin.
(Si se produce error de vinculacin, ser en tiempo de
compilacin)
Vinculacin dinmica: la vinculacin entre mensaje y
mtodo se realiza en tiempo de ejecucin.
(Si se produce error de vinculacin, ser en tiempo de
ejecucin)
16
Herencia (III)
Problemas con la vinculacin
void Persona :: felizCumple()
{
edad ++ ;
cout << FELICIDADES !!! ;
mostrar ( );
}
void main()
{
Alumno alum (77777R, 20, Ana , Ruiz, 3 );
alum . felizCumple( ) ;
}
FELICIDADES !!!
17
Herencia (III)
Solucin a los problemas con la vinculacin
Para solucionar el problema anterior, C++ propone el uso de funciones
virtuales que aseguren que se sigue la pista en todo momento a la
identidad del objeto receptor del mensaje.
Para establecer un mtodo como virtual, basta con escribir la palabra
virtual delante del prototipo del mtodo:
class Persona
{
...
virtual void mostrar() ;
.
}
Herencia (III)
Clases Abstractas
Una clase Abstracta es aquella que solo sirve como base de otras clases.
No se puede crear objetos de esa clase (no se debe).
Normalmente se trata de clases que representan conceptos abstractos de
los que no tiene sentido crear objetos.
Clases Abstractas
Figura
Elipse
Paralelogramo
Circulo
Rectngulo
Romboide
Cuadrado
Rombo
19
Herencia (III)
Clases Abstractas
Una clase Abstracta:
D Modela el comportamiento comn a las clases derivadas.
D Implementa mtodos que son comunes a las clases derivadas.
D Establece mtodos comunes a todas las subclases pero cuya
implementacin corresponde a las subclases.
20
Herencia (III)
Ejemplo:
Abstracta
class Figura
{
public:
void dibujar()
{
cout << perimetro( ); }
virtual float area () = 0;
virtual float perimetro()= 0;
};
Figura
Elipse
Circulo
Rectngulo
Romboide
Cuadrado
Rombo
21
Herencia (III)
Ejemplo:
Abstracta
class Figura
{
public:
void dibujar()
{
cout << perimetro( ); }
virtual float area () = 0;
virtual float perimetro()= 0;
};
22
Cuadrado c(4);
c. dibujar();
16