Está en la página 1de 11

10 HERENCIA

Introduccin
Durante las primeras unidades se estudiaron los tipos abstractos de datos y los principales conceptos
de POO, as como su implementacin en lenguaje C++ a travs de las clases, pero no se trat con
suficiente profundidad uno de los conceptos ms importantes de un lenguaje oriento a objetos, la
herencia.

En esta unidad se estudia de manera detallada esta propiedad y la manera como permite definir
nuevas clases utilizando como base clases ya existentes, lo que promueve la reutilizacin del software
y su produccin de manera confiable, eficiente y adaptable.

Objetivo General
Presentar la herencia y sus principales caractersticas, como una forma de reutilizacin de software.

Objetivos especficos
-

Conocer la herencia como uno de los conceptos principales de la POO.

Comprender la manera en que la herencia promueve la reutilizacin del software.

Estudiar las jerarquas de herencia y comprender las ideas relacionadas con las clases base y
las clases derivadas.

Estudiar los diferentes tipos de herencia.

10.1 CLASES BASE Y DERIVADAS

La Programacin Orientada a Objetos (POO) es un mtodo de implementacin de programas que


desarrolla clases con el fin de representar los objetos del mundo real, y estas clases se relacionan
entre por medio de jerarquas de herencia. Es as como la herencia se convierte en uno de los tres
conceptos ms importantes de esta metodologa y permite a los programadores implementar
programas ms compactos, seguros, fciles de depurar y corregir y verstiles.

La herencia permite utilizar clases existentes, llamadas clases base, para crear nuevas clases,
155

conocidas como clases derivadas. A continuacin se estudian estos conceptos y se revisan algunos
ejemplos de aplicacin.

10.1.1

DEFINICIN DE HERENCIA Y CARACTERSTICAS PRINCIPALES

La herencia es la propiedad que permite definir nuevas clases usando como base las clases ya
existentes, es decir, reutilizar el cdigo ya desarrollado para reducir el cdigo redundante en los
nuevos componentes de clases. La herencia es una herramienta poderosa que proporciona un marco
adecuado para la produccin de software confiable, adaptable y reutilizable, disminuyendo costos y
tiempo en su desarrollo.

La propiedad de herencia se basa en la aplicacin de este concepto en el mundo real, en el cual


podemos ver, por ejemplo, que los animales se dividen en mamferos, anfibios, reptiles, aves, etc., los
vehculos se pueden dividir en automviles, motocicletas, camiones, buses, etc., y un sin nmero de
ejemplos en los cuales el principio fundamental es que en cada una de las divisiones se comparten
ciertas caractersticas comunes y se aaden otras caractersticas especiales; as, por ejemplo, las aves
son animales y adems cuentan con plumas y pueden volar, los mamferos son animales y adems
amamantan a sus cras; por otro lado, los automviles son vehculos, tienen un motor y ruedas,
cuentan con cuatro de ellas, a diferencia de las motocicletas, que tambin son vehculos y tienen
motor pero cuentan con solo dos ruedas.

La utilizacin de esta propiedad supone la diferencia fundamental entre un lenguaje de programacin


orientado a objetos y uno basado en objetos o estructurado.

En la herencia, a la clase existente se le denomina clase base, mientras que a la nueva clase, que
hereda las caractersticas y comportamientos de la clase base, se le conoce como clase derivada.

Las clases derivadas, adems, pueden aadir sus propios datos y comportamientos o cambiar aquellos
elementos de la clase base que necesitan sean diferentes.

Evidentemente, la clase base y la clase derivada tienen cdigo (datos y comportamientos) comunes, y
si se crear la clase derivada de modo independiente, se duplicara mucho de lo que se hizo para la
clase base. La herencia evita este inconveniente y promueve la reutilizacin del software.

156

10.1.2

DECLARACIN DE CLASES DERIVADAS

La sintaxis para la declaracin de una clase derivada es la siguiente:


//Sintaxis para la declaracin de una clase derivada
class <Nombre de la clase derivada> : <Tipo de herencia> <Nombre de la clase base>
{
public:
//Seccin pblica

private:
//Seccin privada

};

En la declaracin anterior los dos puntos (:) son el smbolo para derivacin o herencia y el tipo de
herencia puede ser public, private o protected, que en general determina qu especificador de acceso
a miembro tendrn, en la clase derivada, los miembros que se heredaron de la clase base, como se
explicar ms adelante; si no se especifica ningn tipo de herencia, por defecto se asigna el tipo de
herencia private. Dentro de los tipos de herencia aparece el tipo protected, que es un especificador de
acceso a miembro adicional que se utiliza solamente en el caso de trabajar con herencia.

Cuando se implementa la herencia, la clase derivada hereda todas las funciones miembro y datos
miembro de la clase base, excepto el constructor, el destructor y las funciones amigas. Por esto es
necesario definir un constructor en la clase derivada que puede o no tener de manera explcita el
llamado al constructor de la clase base para que se inicialicen los datos miembro que se heredaron en
la clase derivada.

A continuacin se presenta un ejemplo en el cual se declara una clase base Vector2D, con datos
miembro x y y, y la definicin de su constructor, y una clase derivada vector3D con un dato miembro
adicional z, e igualmente la definicin de su constructor, adems de las funciones miembro tpicas.
//Declaracin de la clase vector2D
class Vector2D{
157

public:
Vector2D(double=0, double=0);
void setVector2D(double, double);
double getx();
double gety();
void imprimir();
double magnitudVector2D();
protected:
double x;
double y;
};

//Definicin del constructor Vector2D


Vector2D:: Vector2D (double l, double a){
x=l;
y=a;
}

//Definicin de la clase derivada Vector3D


class Vector3D:public Vector2D {
public:
Vector3D (double=0, double=0, double=0);
void setz(double);
double getz();
void imprimirVector3D();
double magnitudVector3D ();
private:
double z;
protected:
158

};

//Definicin del constructor Vector3D


Vector3D:: Vector3D(double l, double a, double f)
{
x=l;

//inicializacin de los datos miembro protected heredados de Vector2D

y=a;
z=f;
}

En el ejemplo se puede ver que, a travs de la notacin de herencia, la clase Vector3D hereda los
datos y funciones de la clase Vector2D, sin necesidad de volver a definirlos. Tambin es evidente que
en el constructor de la clase Vector3D se inicializan los datos miembro heredados, x y y teniendo en
cuenta que son declarados dentro del especificador protected. Aunque no hay una llamada explicita al
constructor de la clase base Vector2D, el compilador efecta este llamado implcitamente para
inicializar los datos heredados, una vez se empieza a ejecutar el constructor de Vector3D.

El tipo de herencia utilizado en el ejemplo es public; adelante se explicar con ms detalle cada tipo
de herencia.

10.1.3

MIEMBROS PROTEGIDOS (PROTECTED)

Durante la unidad 2 se estudiaron dos especificadores de acceso a miembro, public y private, que
definan como era el acceso a cada uno de los miembros de la clase, por ejemplo, los miembros
privados solo se pueden acceder a travs de las funciones miembro de la clase y los miembros
pblicos son accesibles desde cualquier parte donde el objeto se encuentre al alcance. Los miembros
protected o protegidos, introducidos en el numeral anterior y apenas nombrados en las unidades
anteriores, establecen un nivel intermedio de acceso ya que, adems de ser accesibles desde
cualquier miembro de la clase, tambin se pueden acceder desde cualquier miembro de las clases
derivadas. Por esta razn solo cobran importancia cuando se utiliza la herencia.

En el ejemplo anterior se puede ver que los datos miembros de la clase Vector2D se especifican como
protectec, y en el constructor de la clase derivada Vector3D se acceden directamente para su
inicializacin. Esta es una ventaja en algunos casos, pero en general se recomienda utilizar el
159

especificador private para los datos miembro de una clase y as promover el encapsulamiento de la
informacin. A continuacin se muestra la definicin del constructor de la clase derivada Vector3D en
el caso en que los datos de la clase Vector2D se declararan como privados:
//Definicin del constructor Caja en el caso de que los datos heredados fueran private
Vector3D:: Vector3D (double l, double a, double f)
: Vector2D (l,a)

//Llamado al constructor de la clase base para inicializar los datos

//dentro de lo que se conoce como lista de inicializacin de miembros


z=f;

Si los datos heredados por la clase Vector3D son privados, y teniendo en cuenta que los datos
privados solo se pueden acceder desde las funciones miembro de la clase, es necesario hacer un
llamado a alguna funcin miembro de la clase Vector2D dentro del constructor de Vector3D para
poder inicializarlos, en este caso se hace un llamado al constructor de Vector2D, dentro de lo que se
conoce como una lista de inicializacin de miembros (despus del parntesis de los parmetros se
escribe el operador dos puntos (:) y se llama la funcin correspondiente).

10.2 TIPOS DE HERENCIA

Existen diferentes clasificaciones para la herencia, como ya se mencion anteriormente, segn el


especificador de acceso a miembro, la herencia se clasifica en public, private y protected, a
continuacin se define cada una de ellas:
-

Herencia public: Este tipo de herencia especifica que los datos y funciones miembro
heredados de la clase base conservan el mismo especificador de acceso en la clase derivada,
es decir, los miembros pblicos de la clase base son pblicos en la clase derivada, los
miembros protegidos en la clase base continan siendo protegidos en la clase derivada, y los
miembros privados en la clase base siguen siendo privados en la clase derivada. Este tipo de
herencia es el ms utilizado.

Herencia protected: Con este tipo de herencia se define que los miembros pblicos y
protegidos de la clase base se especifican como protegidos en la clase derivada, y los datos
privados de la clase base siguen siendo privados en la clase derivada. Su uso no es muy
comn, salvo en aplicaciones muy especficas.

160

Herencia private: Cuando se utiliza este tipo de herencia los miembros pblicos y protegidos
de la clase base, se especifican como privados en la clase derivada. Su uso no es muy comn,
salvo en aplicaciones muy especficas.

En la siguiente tabla se resume el especificador de acceso a miembro para la clase derivada, segn el
tipo de herencia:
Tipo de

Acceso miembro Acceso miembro

Herencia
public

clase base
public

Public

protected

Protected

private

Private

protected public

private

clase derivada

Protected

protected

Protected

private

Private

public

Private

protected

Private

private

Private

Una segunda clasificacin para la herencia, segn el nmero de clases base, la divide en simple y
mltiple:
-

Herencia simple: es un tipo de herencia en el cual una clase derivada hereda datos y funciones
de una sola clase base. Es el tipo de herencia de ms amplia utilizacin. Su sintaxis es la misma
que se ha utilizado hasta ahora.

Herencia mltiple: es un tipo de herencia en el cual una clase derivada hereda datos y
funciones de ms de una clase base. Su sintaxis es la siguiente:

//Sintaxis para la declaracin de un herencia mltiple


class <clase derivada> : <Tipo> <clase base1>, <Tipo> <clase base2>, <Tipo> <clase base2>,
{
public:
161

//Seccin pblica

private:
//Seccin privada

};

Este tipo de herencia presenta inconvenientes relacionados con la ambigedad por el uso de
nombres de miembros idnticos en diferentes clases base y, por consiguiente, la
preponderancia o dominacin de estos dentro de la clase derivada. En general no es muy
utilizada, salvo aplicaciones muy especficas.

10.3 TIPOS DE RELACIN

Cuando en un programa orientado a objetos se crean diferentes clases, cuyas instancias u objetos
interactan entre s, estas clases se relacionan de diferentes formas dependiendo del vnculo o la
forma de declaracin que se utilice.

Cuando se utilizan la herencia, se establece una relacin es un, en donde un objeto de una clase
derivada tambin es un objeto de la clase base. Por ejemplo, al crear un jerarqua de clases de figuras
geomtricas con cuadriltero como clase base, y cuadrado, rectngulo, rombo y trapecio como clases
derivadas, un objeto de la clase trapecio tambin es un objeto de la clase cuadriltero. De igual
forma ocurre con el ejemplo mencionado anteriormente en el que un ave tambin es un animal.

Esta caracterstica se debe tener en cuenta siempre que se vaya a establecer una jerarqua de
herencia para un programa orientado a objetos.

En cambio, cuando se utiliza un objeto de una clase determinada como dato miembro de otra clase,
se establece una relacin tiene un, en la que un objeto hace parte de la implementacin de otra
clase, sin entregar sus datos y funciones para que hagan parte de la definicin de la nueva clase. Este
tipo de relacin se conoce comnmente como Composicin.

162

Por ejemplo, si se quiere implementar la clase vehculo, podran utilizarse objetos de las clases motor,
suspensin, carrocera, etc., como sus miembros, es decir, un objeto de la clase vehculo tiene un
motor, suspensin o carrocera.
//Ejemplo de composicin con la clase vehculo y motor

//Declaracin de la clase Motor


class Motor{
public:
Motor();
void setMotor(double, double);
double getPotencia();
double getCilindraje();
void imprimir();
double torqueMotor();
private:
double potencia;
double cilindraje;
};

//Definicin de la clase Vehiculo


class Vehiculo{
public:
Vehiculo(double, Motor);
void setPrecio(double);
double getPrecio();
void imprimirVehiculo();
private:
double precio;
Motor VS1000;
163

};

Igualmente en programacin orientada a objetos se presentan otros tipos de relaciones, por ejemplo
la relacin usa un se presenta cuando una funcin utiliza o recibe como parmetro un objeto de una
clase, y a partir de sus datos obtiene algn resultado especfico.

Resumen
La herencia es una propiedad que permite al programador crear nuevas clases a partir de clases ya
existentes. A las clases existentes se les conoce como clases base y a las nuevas clases se les conoce
como clases derivadas.

Existen diferentes tipos de herencia. Segn el nmero de clases base se puede clasificar en herencia
simple, cuando solo hay una clase base y herencia mltiple, cuando la clase derivada hereda de ms
de una clase base. Segn el especificador de acceso a miembro, la herencia se puede clasificar en
public, private y protected: la herencia public mantiene el especificador de acceso de cada miembro
de la clase base, en la clase derivada. Es la ms utilizada.

Adems de la herencia, que establece una relacin es un entre las clases, existe otro tipo de relacin
entre clases conocida como composicin, en la que un objeto de una clase es miembro de otra clase,
por lo tanto se puede decir que un objeto de una clase tiene un objeto de otra clase.

La herencia es una caracterstica fundamental de un programa orientado a objetos y adems permite


la reutilizacin del software, que hace posible la implementacin de programas robustos, confiables y
con menores requerimientos de costos y tiempo.

Actividades complementarias
-

Implementar una clase Automvil dentro de una jerarqua de herencia mltiple. Considere
que, adems de ser un Vehculo, un automvil es tambin una comodidad, un medio de
transporte, etc. Automvil debe tener al menos tres clases base y al menos tres clases
derivadas.

164

Para definir un punto en un sistema de coordenadas de dos dimensiones es muy comn


utilizar la forma (x,y) llamada coordenadas rectangulares. Construya una clase llamada Punto
que describa puntos en esta forma. Escriba un constructor y las respectivas funciones para
establecer y obtener los datos.
Construya una clase derivada Circulo a partir de la clase Punto, que contenga el miembro
adicional radio, para especificar el radio del crculo. Adems funciones miembro que permitan
calcular el rea y la circunferencia del crculo, que estn dadas por las siguientes ecuaciones:

AreaCirculo r 2

Circunfere ncia Circulo 2r

Construya una clase derivada Cilindro a partir de la case Circulo, que contenga el miembro
adicional h, para especificar la altura del cilindro. Adems funciones miembro que permitan
calcular el rea y el volumen del cilindro, que estn dadas por las siguientes ecuaciones:

Volumen Cilindro r 2 h

AreaCilindro 2r 2 2rh

Lecturas recomendadas
SMITH JO ANN, C++ Programacin Orientada a Objetos. Editorial Paraninfo, 1999. Pginas 91 a 148.

DIETEL, H. M., DIETEL, P. J. Cmo programar en C++. Editorial Pearson Education, 4 Edicin 2003.
Pginas 609 a 648.

JOYANES, Luis J., Programacin en C++, Algoritmos, estructuras de datos y objetos. Editorial Mc Graw
Hill, 2 Edicin 2002. Pginas 479 a 497.

165

También podría gustarte