Estructura de Datos con Algoritmo
Profesora María de Dimares
Preparado por: Andrea Ruiz
Joel Solís
1 de Agosto de 2012
Se entiende por herencia el proceso por el que un objeto
puede tomar características de otro objeto.
La herencia se puede usar de dos formas:
1. Cuando una clase escrita no llega a cubrir las necesidades
que exige un determinado problema, se
puede retocar el código cambiando las características que se
requieren, e ignorando el resto.
Esto permite una programación rápida. Esto es una forma de
reutilización del código.
2. Se expresa un determinado problema como una jerarquía
de clases, donde existe una clase base de la
que se derivan otras subclases. La interfaz de la clase base
es común a todas las clases derivadas
Los constructores y destructores no son heredados por las
clases derivadas. Sin embargo, una instancia de una clase
derivada contendrá todos los miembros de la clase base, y
éstos deben ser iniciados. En consecuencia, el constructor de
la clase base debe ser llamado por el constructor de la clase
derivada.
Dado que una clase derivada se puede entender como un
súper conjunto de la clase base, que va a contener todos los
miembros de la clase base, una instancia de la clase derivada
se puede emplear de forma automática como si fuera una
instancia de la clase base. El caso contrario no es cierto, no
se puede tratar un objeto de la clase base como si fuera un
objeto de una clase derivada, ya que el objeto de la clase
base no tiene todos los miembros de la clase derivada.
La relación de herencia entre clases puede ser: pública
(public), privada (private) ó protegida (protected).
La relación que se utiliza con mayor frecuencia es la pública.
Dependiendo del número de clases y de cómo se relacionen,
la herencia puede ser:
a) Simple.
b) Múltiple.
Herencia Simple La herencia en C++ es un mecanismo de
abstracción creado para poder facilitar, y mejorar el diseño de las
clases de un programa. Con ella se pueden crear nuevas clases a
partir de clases ya hechas, siempre y cuando tengan un tipo de
relación especial. En la herencia, las clases derivadas “heredan”
los datos y las funciones miembro de las clases base, pudiendo
las clases derivadas redefinir estos comportamientos
(polimorfismo) y añadir comportamientos nuevos propios de las
clases derivadas.
La forma general de la herencia en C++ es:
class <nombre_clase_derivada>: [<acceso>]
<nombre_clase_heredada> {
// Cuerpo de la declaración de la clase
};
Una clase derivada puede tener un miembro con el mismo
nombre que un miembro de la clase base. Cuando
ocurre esto, y se referencia este nombre que está duplicado, el
compilador asumirá que se desea acceder al
miembro de la clase derivada.
Este hecho se conoce como anulación, invalidación o
suplantación del miembro de la clase base por el miembro
de la clase derivada.
Para acceder al miembro de la clase base se deberá utilizar el
operador de resolución de ámbito.
Es la propiedad con la cual una clase derivada puede tenermás de una clase base. Es más
adecuada para definir objetos que son compuestos, pornaturaleza, tales como un registro
personal, un objeto gráfico.
La sintaxis de la herencia múltiple es una extensión de lautilizada para la herencia simple. La manera de
expresar este tipo de herencia es mediante una lista deherencia, que consta de las clases de las que se hereda
separadas por comas.
El uso de funciones constructor y destructor en clases derivadas es máscomplejo que en una
clase simple. Al crear clases derivadas con una sola clase base, seobserva que el constructor de
la clase base se llama siempre antes que el constructor de la clasederivada. Además se dispone
de un mecanismo para pasar los valores de los parámetros necesarios alconstructor base desde
el constructor de la clase derivada. Así, la sentencia siguiente pasa elpuntero a carácter x y el
valor del entero y a la clase base:
derivada (char *x, int y, double z): base(x,y)
Este método se expande para efectuar más de una clase base. La sentencia:
derivada (char *x,int y, double z): base1(x),base2(y)
En la herencia múltiple aparecen ambigüedades, como en el ejemplode encima: si la clase Músico heredaba de Persona y Trabajador, y laclase Trabajador heredaba de Persona. Existirían las siguientesreglas:
Músico Estudiante : Persona, Músico, Trabajador
Músico : Persona, Trabajador
Trabajador: Persona
Si un compilador está mirando la clase Músico Estudiante necesitasaber si debe juntar las características iguales o si deben estarseparadas. Por ejemplo, tendría sentido unir las características "Edad"de Persona para Músico Estudiante. La edad de una persona nocambia si le consideras una Persona, un Trabajador o un Músico. Sinembargo, tendría sentido separar la característica "Nombre" dePersona y Músico si los músicos usan un nombre artístico diferente desu nombre real. Las opciones de juntar y separar son válidas según elcontexto, y sólo el programador sabe qué opción es correcta para laclase que está diseñando.
Hay debate sobre si la herencia múltiple puede ser
implementada de forma simple y sin ambigüedad. Con
frecuencia es criticada por su aumentada complejidad y su
ambigüedad, así como los problemas de versiones y
mantenimiento que puede causar (a menudo resumido
como el problema del diamante).
Los detractores también señalan que hay problemas de
implementación de la herencia múltiple como no ser capaces
de explicitar herencia de múltiple clases y el orden de las
semánticas de clase que cambian con la herencia. Hay
lenguajes que solucionan todos los problemas técnicos de la
herencia múltiple, pero el debate principal sigue sobre si
implementar y usar herencia múltiple es más fácil que usar
herencia simple y patrones de diseño de software.
Top Related