Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
#5
UESFIAEIEPEL115
1/7
Universidad de El Salvador
Facultad de Ingeniera y Arquitectura
Escuela de Ingeniera Elctrica
PROGRAMACIN I
Gua de Laboratorio #5
Tema: Herencia
Profesor:
wzelaya@ing.ues.edu.sv
ingwzelaya-pel115@yahoo.com
Instructor:
cpocasangre@ing.ues.edu.sv
copocasangre@gmail.com
CICLOII2012
Gua.#5
UESFIAEIEPEL115
2/7
5.1Introduccin
Una de las propiedades ms importantes de la POO es la abstraccin de datos. Esta propiedad se manifiesta esencialmente
en la encapsulacin, que es la responsable de gestionar la complejidad de grandes programas al permitir la definicin de
nuevos tipos de datos: las clases.
Sin embargo, la clase no es suficiente por s sola para soportar diseo y programacin orientada a objetos. Se necesita un
medio para relacionar unas clases con otras. Un medio son las clases anidadas(objetos miembros de otros objetos), pero
slo se resuelve parcialmente el problema, ya que las clases anidadas no tienen las caractersticas requeridas para
relacionar totalmente una clase con otra. Se necesita un mecanismo para crear jerarquas de clases en las que la clase A sea
afn a la clase B, pero con la posibilidad de poder aadirle tambin caractersticas propias. Este mecanismo es la herencia.
La herencia es, seguramente, la caracterstica ms potente de la POO, despus de las clases. Por herencia conocemos el
proceso de crear nuevas clases, llamadas clases derivadas, a partir de una clase base.
En C++ la herencia se manifiesta con la creacin de un tipo definido por el usuario (clase), que puede heredar las
caractersticas de otra clase ya existente o derivar las suyas a otra nueva clase. Cuando se hereda, las clases derivadas
reciben las caractersticas (estructuras de datos y funciones) de la clase original, a las que se pueden aadir nuevas
caractersticas o modificar las caractersticas heredadas. El compilador hace realmente una copia de la clase base en la
nueva clase derivada y permite al programador aadir o modificar miembros sin alterar el cdigo de la clase base.
La derivacin de clases consigue la reutilizacin efectiva del cdigo de la clase base para sus necesidades. Si se tiene una
clase base totalmente depurada, la herencia ayuda a reutilizar ese cdigo en una nueva clase. No es necesario comprender
el cdigo fuente de la clase original, sino slo lo que hace.
5.2 Clases derivadas
En C++, la herencia simple se realiza tomando una clase existente y derivando nuevas clases de ella. La clase derivada
hereda las estructuras de datos y funciones de la clase original . Adems, se pueden aadir nuevos miembros a las clases
derivadas y los miembros heredados pueden ser modificados.
Una clase utilizada para derivar nuevas clases se denomina clase base, clase padre, superclase o ascendiente. Una clase
creada de otra clase se denomina clase derivada o subclase. Se pueden construir jerarquas de clases, en las que cada clase
sirve como padre o raz de una nueva clase.
5.3 Conceptos fundamentales de derivacin
C++ utiliza un sistema de herencia jerrquica. Es decir, se hereda una clase de otra, creando nuevas clases a partir de las
clases ya existentes. Slo se pueden heredar clases, no funciones ordinarias n variables, en C++. Una clase derivada hereda
todos los miembros dato excepto, miembros dato estticos, de cada una de sus clases base. Una clase derivada hereda las
funciones miembro de su clase base. Esto significa que se hereda la capacidad para llamar a funciones miembro de la clase
base en los objetos de la clase derivada.
Los siguientes elementos de la clase no se heredan:
- Constructores
- Destructores
- Funciones amigas
- Funciones estticas de la clase
- Datos estticos de la clase
- Operador de asignacin sobrecargado
CICLOII2012
Gua.#5
UESFIAEIEPEL115
3/7
Las clases base diseadas con el objetivo principal de ser heredadas por otras se denominan clases abstractas.
Normalmente, no se crean instancias a partir de clases abstractas, aunque sea posible.
5.4 La herencia en C++
En C++ existen dos tipos de herencia: simple y mltiple. La herencia simple es aquella en la que cada clase derivada
hereda de una nica clase. En herencia simple, cada clase tiene un solo ascendiente. Cada clase puede tener, sin embargo,
muchos descendientes.
La herencia mltiple es aquella en la cual una clase derivada tiene ms de una clase base. Aunque el concepto de herencia
mltiple es muy til, el diseo de clases suele ser ms complejo.
5.5 Creacin de una clase derivada
Cada clase derivada se debe referir a una clase base declarada anteriormente.
La declaracin de una clase derivada tiene la siguiente sintaxis:
class clase_derivada : <especificadores_de_acceso>
clase_base {...};
Gua.#5
UESFIAEIEPEL115
4/7
definir a su vez un constructor que llama al constructor de la clase base proporcionndole los argumentos requeridos.
Un constructor de una clase derivada debe utilizar un mecanismo de pasar aquellos argumentos requeridos por el
correspondiente constructor de la clase base.
derivada :: derivada(tipo1 x, tipo2 y) : base (x,y) {...}
Otro aspecto importante que es necesario considerar es el orden en el que el compilador C++ inicializa las clases base de
una clase derivada. Cuando El compilador C++ inicializa una instancia de una clase derivada, tiene que inicializar todas las
clases base primero. Por definicin, un destructor de clases no toma parmetros. Al contrario que los constructores, una
funcin destructor de una clase derivada se ejecuta antes que el destructor de la clase base.
5.8 Redefinicin de funciones miembro heredadas
Se pueden utilizar funciones miembro en una clase derivada que tengan el mismo nombre que otra de una clase base. La
redefinicin de funciones se realiza mediante funciones miembro sobrecargadas en la clase derivada. Una funcin miembro
redefinida oculta todas las funciones miembro heredadas del mismo nombre. Por tanto cuando en la clase base y en la clase
derivada hay una funcin con el mismo nombre en las dos, se ejecuta la funcin de la clase derivada.
5.9 Herencia mltiple
Es la propiedad con la cual una clase derivada puede tener ms de una clase base. Es ms adecuada para definir objetos
que son compuestos, por naturaleza, tales como un registro personal, un objeto grfico.
Slo es una extensin de la sintaxis de la clase derivada. Introduce una cierta complejidad en el lenguaje y el compilador,
pero proporciona grandes beneficios.
class ejemplo : private base1 , private base2 {...};
La aplicacin de clases base mltiples introduce un conjunto de ambigedades a los programas C++. Una de las ms
comunes se da cuando dos clases base tienen funciones con el mismo nombre, y sin embargo, una clase derivada de ambas
no tiene ninguna funcin con ese nombre. Cmo acceden los objetos de la clase derivada a la funcin correcta de la clase
base ? El nombre de la funcin no es suficiente, ya que el compilador no puede deducir cul de las dos funciones es la
invocada.
Si se tiene una clase C que se deriva de dos clases base A y B, ambas con una funcin mostrar() y se define un objeto de la
clase C: C objeto C, la manera de resolver la ambigedad es utilizando el operador de resolucin de mbito:
objetoC.A::mostrar();
objetoC.B::mostrar();
double z) : base(x,y)
CICLOII2012
Gua.#5
UESFIAEIEPEL115
5/7
EJEMPLO 01:
Partiremos de la clase "Persona". Independientemente de la profesin, todas las personas tienen propiedades comunes,
nombre, fecha de nacimiento, gnero, estado civil, etc.
La siguiente clasificacin debe ser menos general, supongamos que dividimos a todas las personas en dos grandes clases:
empleados y estudiantes. (Dejaremos de lado, de momento, a los estudiantes que adems trabajan). Lo importante es
decidir qu propiedades que no hemos incluido en la clase "Persona" son exclusivas de los empleados y de los estudiantes.
Por ejemplo, los ingresos por nmina son exclusivos de los empleados, la nota media del curso, es exclusiva de los
estudiantes. Una vez hecho eso crearemos dos clases derivadas de Persona: "Empleado" y "Estudiante".
Haremos una nueva clasificacin, ahora de los empleados. Podemos clasificar a los empleados en ejecutivos y comerciales
(y muchas ms clases, pero para el ejemplo nos limitaremos a esos dos). De nuevo estableceremos propiedades exclusivas
de cada clase y crearemos dos nuevas clases derivadas de "Empleado": "Ejecutivo" y "Comercial".
Ahora veremos las ventajas de disponer de una jerarqua completa de clases.
CICLOII2012
Gua.#5
UESFIAEIEPEL115
6/7
Cada vez que creemos un objeto de cualquier tipo derivado, por ejemplo de tipo Comercial, estaremos creando en un slo
objeto un Comercial, un Empleado y una Persona. Nuestro programa puede tratar a ese objeto como si fuera cualquiera de
esos tres tipos. Es decir, nuestro comercial tendr, adems de sus propiedades como comercial, su nmina como empleado,
y su nombre, edad y gnero como persona.
Siempre podremos crear nuevas clases para resolver nuevas situaciones. Consideremos el caso de que en nuestra
clasificacin queremos incluir una nueva clase "Becario", que no es un empleado, ni tampoco un estudiante; la
derivaramos de Persona. Tambin podemos considerar que un becario es ambas cosas, sera un ejemplo de derivacin
mltiple, podramos hacer que la clase derivada Becario, lo fuera de Empleado y Estudiante.
Podemos aplicar procedimientos genricos a una clase en concreto, por ejemplo, podemos aplicar una subida general del
salario a todos los empleados, independientemente de su profesin, si hemos diseado un procedimiento en la clase
Empleado para ello.
#include <iostream>
#include <cstring>
using namespace std;
class Persona {
public:
Persona(char *n) { strcpy(nombre, n); }
void VerNombre() { cout << nombre << endl; }
protected:
char nombre[30];
};
class Empleado : public Persona {
public:
Empleado(char *n) : Persona(n) {}
void VerNombre() { cout << "Emp: " << nombre << endl; }
};
class Estudiante : public Persona {
public:
Estudiante(char *n) : Persona(n) {}
void VerNombre() { cout << "Est: " << nombre << endl;
};
int main() {
Persona *Pepito = new Estudiante("Jose");
Persona *Carlos = new Empleado("Carlos");
Carlos->VerNombre();
Pepito->VerNombre();
delete Pepito;
delete Carlos;
cin.get();
return 0;
}
CICLOII2012
Gua.#5
UESFIAEIEPEL115
7/7
EJEMPLO 02:
#include <iostream>
using namespace std;
class ClaseA {
public:
ClaseA() : datoA(10) { cout << "Constructor de A" << endl; }
~ClaseA() { cout << "Destructor de A" << endl; }
int LeerA() const { return datoA; }
protected:
int datoA;
};
class ClaseB : public ClaseA {
public:
ClaseB() : datoB(20) {cout << "Constructor de B" << endl; }
~ClaseB() { cout << "Destructor de B" << endl; }
int LeerB() const { return datoB; }
protected:
int datoB;
};
int main() {
ClaseB objeto;
cout << "a = " << objeto.LeerA() << ", b = " << objeto.LeerB() << endl;
cin.get();
return 0;
}
ASIGNACION
Terminar la Clase Base Persona segn se muestra en el diagrama de jerarquas anteriormente mostrado.
CICLOII2012