herencia en c++

15
Estructura de Datos con Algoritmo Profesora María de Dimares Preparado por: Andrea Ruiz Joel Solís 1 de Agosto de 2012

Upload: joel1386

Post on 20-Jul-2015

7.210 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Herencia en C++

Estructura de Datos con Algoritmo

Profesora María de Dimares

Preparado por: Andrea Ruiz

Joel Solís

1 de Agosto de 2012

Page 2: Herencia en C++

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

Page 3: Herencia en C++

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.

Page 4: Herencia en C++

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.

Page 5: Herencia en C++

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.

Page 6: Herencia en C++

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

};

Page 7: Herencia en C++

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.

Page 8: Herencia en C++

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.

Page 9: Herencia en C++

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)

Page 10: Herencia en C++

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.

Page 11: Herencia en C++

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.

Page 12: Herencia en C++
Page 13: Herencia en C++
Page 14: Herencia en C++
Page 15: Herencia en C++