programación avanzada en c++ - · pdf file2008 © luis hernández...

82
1 Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 2008 © Luis Hernández Programación Avanzada en C++ L. Hernández

Upload: lekhanh

Post on 07-Feb-2018

236 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

1Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programación Avanzada en C++L. Hernández

Page 2: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

2Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

ProgramaciónOrientada a Objetos

Page 3: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

3Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Nuevas incorporaciones desde C

Espacio de utilización de una variable: se puede declarar variables en

cualquier parte del programa. variables globales

Acceso a variables ocultas.

Page 4: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

4Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Nuevas incorporaciones desde C

Referencias Nombre alternativo para una variable u objeto

int i=1;int &x=i;

Las variables x e i se refieren al mismo espacio de memoria.

Se tienen que inicializar siempre. Se utilizan en pase de parámetros a funciones donde se

quiera modificar su contenido. Memoria dinámica:

new tipo[tamaño]; delete [] puntero;

Page 5: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

5Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Nuevas incorporaciones desde C

Declaraciones de funciones Parámetros con valor por defecto. En funciones con varios parámetros:

• si el parámetro k-1 está definido por defecto, el parámetro k también tiene que estarlo.

Pase de parámetros por referencia.

Page 6: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

6Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Nuevas incorporaciones desde C

Operadores E/S: operador extracción: >> operador inserción: << Stream de entrada estándar: cin Stream de salida estándar: cout

Page 7: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

7Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Evolución hacia la POO

Objetivos de la evolución: Menor interconexión entre las partes de un programa. Ocultación de la información. Abstracción:

• que los componentes del S.W. sean lo más cercano posible a las ideas que componen el problema.

Re-utilización del código. Todos estos objetivos están relacionados, pero la

piedra angular es la ocultación de la información.

Page 8: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

8Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programación con procedimientos

El programa se divide en dos partes: Algoritmos Datos

La parte algorítmica se estructura en procedimientos. Beneficios:

Abstracción de operaciones. Extensión del lenguaje. Re-utilización del código.

Inconvenientes: No existe una clara estructuración de los datos que los

relacione con los procedimientos que los manejan. Indefensión ante varios problemas:

• No se garantiza el correcto estado de las estructuras de información.

• No hay independencia de representación.

Page 9: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

9Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

FIFO: Programación con procedimientos No hay nada que impida que un programador haga un mal

uso de los datos. Ejemplo: confundir el uso de cola y cabeza.

No es posible garantizar que la cola se encuentra en un estado correcto.

¿Que sucede si un día queremos cambiar la estructura de los datos? Ejemplo: cambiar el vector de la cola por una lista enlazada.

• Tendría que re-escribir el programa. Realmente,¿qué parte del código es re-utilizable?.

Page 10: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

10Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

FIFO: Ocultación de la información Cierta parte de los datos y funciones sólo será accesible desde

ciertas funciones. Si el interfaz está bien definido, el estado de la cola siempre es

correcto. Si se cambia la estructura interna de los datos sólo hay que

cambiar las funciones del interfaz. Re-utilización del código. Se aprovecha:

la estructura de datos las funciones que la manejan

Ocultación de la información = Encapsulamiento de los datos

Page 11: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

11Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Formas de ocultación de la información

Módulos (Programación modular) Las funciones (procedimientos) y datos se agrupan en

diferentes ficheros (módulos). Para cada módulo se definen los procedimientos y datos

que se exportan. Sólo se puede acceder desde fuera del módulo a aquella

parte que ha sido exportada. Objetos (Programación orientada a objetos)

Un módulo se compone de dos partes: definición → Interfaz implementación → Código

de la interfaz y de la parte oculta.

Page 12: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

12Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programación modular

Aportaciones de la modularidad Descomposición de un problema complejo en módulos

más simples. Re-utilización de los módulos existentes para desarrollar

nuevo software. Independencia de la implementación. Ocultación de la información.

Limitaciones de la modularidad Ejemplo: Sólo puedo tener una cola en mi programa.

Page 13: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

13Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programación orientada a objetos

Los objetos son entidades que agrupan datos y procedimientos que operan sobre esos datos. modulo ≈ fichero objeto ≈ variable

Los objetos se caracterizan por tres propiedades: Estado Operaciones Identidad dentro del programa (=instanciación)

Una clase es la descripción de un conjunto de objetos similares. Los objetos son instancias de una clase.

Ejemplo: podemos definir la clase matriz y a partir de ella los objetos matriz1 y matriz2.

Page 14: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

14Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases y objetos

Clase: Abstracción de un conjunto de objetos

caracterizados por las mismas propiedades y los mismos comportamientos.

Objeto: Abstracción capaz de responder a una petición

del servicio de mensaje.

Un objeto es una instancia de una clase. La clase contiene su comportamiento y sus

propiedades. El objeto puede crearse dinámicamente en el

transcurso de la ejecución de un programa.

Page 15: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

15Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Objetos

El mensaje es el único medio de comunicación entre los objetos. Consiste en una petición explícita de una operación que

debe realizar el objeto Puede ser asociado a una llamada de procedimiento

Page 16: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

16Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

El concepto de objeto

Objeto: Entidad de programación con componentes de dos tipos: Estado: Datos Comportamiento: Procedimientos que manipulan los

datos con exclusividad. Cada objeto posee un interfaz que contiene los

servicios que oferta al exterior.

Page 17: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

17Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programación orientada a objetos

Acceso convencional vs OO Comunicación entre objetos:

Un objeto pide un servicio a otro por medio de un mensaje: destinatario + operación + argumentos

Page 18: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

18Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Globalidad vs Localidad Programación modular

Aquí los datos son globales, son accesibles desde todos los procedimientos.

Programación por objetos: Aquí los datos son locales a cada objeto. Sólo son accesibles para los procedimientos

(operaciones) definidos en el objeto.

Page 19: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

19Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases y objetos

Clase vehiculo

Campos velocidad nombre precio cantidad

Métodos precioConIVA:

devolver (1,16*precio) darVelocidad:

devolver (velocidad) retirar(c):

cantidad   cantidad ­ c← añadir(c):

cantidad   cantidad + c←

Page 20: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

20Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Declaración de clases

Declaración de la clase Definición de las

funciones de la clase Instanciación de la clase

Page 21: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

21Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programa ejemplo: Pila

Page 22: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

22Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Programa ejemplo: Pila

Page 23: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

23Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Constructores y destructores Constructor

Función miembro de la clase que se ejecuta cuando se crea un objeto.

Podemos tener varios constructores en una clase, pero han de diferir en los parámetros.

Destructor Función miembro de la

clase que se ejecuta al final de la vida de cada objeto.

Page 24: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

24Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Utilización de constructores

Utilización de constructores: Sin parámetros: A a; Con un parámetro: A a(5); ó A a=5; Con varios parámetros: A a(5,3);

Constructores por defecto: Constructor copia:

• Crea un objeto b2 donde los datos de b2 serán iguales a los de b1.

• Aunque no se defina el constructor copia, éste existe para que se puedan pasar objetos como parámetros por valor.

Constructor sin parámetros:• Aunque no se defina, éste existe para que se puedan

definir objetos de la clase (no ejecuta nada).

Page 25: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

25Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Utilización de constructores Desaparición de constructores por defecto:

Constructor sin parámetros:• Desaparece cuando definimos cualquier otro constructor.

Constructor copia:• Desaparece cuando definimos un nuevo constructor copia.• Siempre hay un constructor copia, y solo uno, en cada

clase.

Page 26: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

26Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Constructor copia

Definición Utilización

Page 27: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

27Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases compuestas

Una clase donde algún dato miembro es un objeto de otra clase. ¿Cuál es el orden de construcción?

Page 28: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

28Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Expansión inline

Evitar llamadas a funciones. El compilador simula el

pase de parámetros.

Page 29: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

29Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases y funciones friend Funciones friend:

Una función ajena a la clase pueda acceder a la parte privada de la clase.

Clases friend: Todos los métodos de una clase puedan acceder a la

parte privada de otra clase.

Page 30: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

30Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Distinguir entre: variables miembro de una clase otro tipo de variables.

Operador resolución de ámbito “::”

Calificación de variables miembro

Page 31: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

31Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Palabra reservada this

Representa un puntero al objeto que recibe la llamada. Todos los objetos de todas las clases tienen this

como dato miembro.

Page 32: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

32Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Variables de clase e instancia Variables de clase:

común a todos los objetos (instancias) de una clase. Variables de instancia:

propio de cada objeto (instancia) de la clase.

Page 33: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

33Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Variables de clase e instancia

Page 34: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

34Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Funciones de clase Funciones de clase:

Actúan sobre variables de clase. Sólo pueden actuar sobre las variables de instancia de la

propia clase cuando pertenecen a un objeto: • pasado como parámetro.• declarado dentro de la propia función.

Page 35: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

35Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Punteros a objetos

Declaración de punteros a objetos de una clase. Utilización del operador new y delete:

Al ejecutarse el operador new, se llama al constructor de la clase automáticamente (malloc no lo hace).

delete llama al destructor (free no).

Page 36: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

36Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de vectoresy punteros a objetos

Page 37: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

37Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia

Page 38: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

38Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia

Definir una nueva clase: como extensión de otra previamente definida. sin modificar la ya existente.

La nueva clase hereda de la clase anterior: las variables. las operaciones .

Principal objetivo/ventaja: Reutilización del código.

• Ahorro de esfuerzo.• Mayor confianza en el código.

Page 39: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

39Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Organización jerárquica

Page 40: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

40Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia en POO

Una función recibe un objeto de la clase base.void Despedir (empleado);

Una función puede recibir objetos de la clase base y también de sus derivadas.empleado e;empleado_producción ep;empleado_comerciales ec;Despedir (e);Despedir (ep);Despedir (ec);

Page 41: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

41Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia de métodos y variables

Las clases derivadas reciben (=heredan) las variables y métodos de la clase base.Empleado_comercial ec;Empleado_produccion ep;ec.Cambiar_Sueldo();ep.Cambiar_Sueldo();

Page 42: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

42Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Composición y herencia

Composición: Relación tener-un

Un coche tiene un motor Contener un objeto.

Herencia: Relación ser-un

Un coche es un vehículo Contener una clase.

Page 43: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

43Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplos de composición y herencia

Clase persona y clase empleado. Herencia: un empleado es una persona.

Clase persona y clase domicilio. Composición: una persona tiene un domicilio.

Clase lista y clase nodo de la lista: Composición: una lista tiene un puntero de tipo nodo al

nodo que está en cabeza de la lista (tener-un). Clase empresa, clase empleado y clase jefe de grupo

de empleados. Herencia entre empleado y jefe.

• Un jefe es un empleado. Composición entre empresa y empleado o jefe.

• Una empresa puede tener una lista de empleados y otra de jefes.

• Por el principio de los subtipos, una empresa puede tener una única lista donde aparezcan tanto jefes como empleados.

Page 44: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

44Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de herencia

Page 45: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

45Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de herencia

Los miembros de la clase empleado se pueden utilizar en las clases derivadas tal y como si hubiesen sido definidos en éstas

Page 46: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

46Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Modos de acceso

private Lo que es “private” en la clase base no es accesible en

la clase derivada. public

Lo que definimos como “public” es accesible desde cualquier parte.

protected Lo que definimos como “protected” en la clase base:

• es accesible en la clases derivadas• no es accesible fuera de las clases derivadas o base.

Page 47: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

47Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Tipos de herencia public

los modos de acceso a los miembros de la clase base se quedan igual en la clase derivada.

protected los miembros “public” de la clase base pasan a ser

“protected”, el resto se queda igual. private

todos los miembros de la clase base pasan a ser “private” en la derivada.

Page 48: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

48Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Redefinición de miembros

A veces, interesa cambiar en la subclase la definición de algo que está en la clase base. Lo redefinido no desaparece.

Page 49: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

49Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de redefinición de miembros

Page 50: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

50Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia múltiple Una clase derivada hereda

las características de más de una clase base.

Page 51: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

51Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Constructores y destructores

Construcción objeto clase derivada: Primero se construye la parte heredada de la clase(s)

base.• Se ejecutan los constructores de las clases base.

Por último se ejecuta el código del constructor de la clase derivada.

Destrucción objeto clase derivada: El proceso es a la inversa que en la construcción.

• Se ejecuta primero el destructor de la clase derivada y a continuación los de las clases base.

Page 52: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

52Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de constructores y destructores

Constructores y destructores en la herencia

Page 53: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

53Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de constructores y destructores

Constructores y destructores en clases compuestas y derivadas.

Page 54: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

54Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de constructores y destructores

Llamadas a los constructores de las clases base.

Page 55: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

55Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de constructores y destructores

Page 56: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

56Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de constructores y destructores

Page 57: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

57Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clase base virtual

Page 58: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

58Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Herencia virtual

Si una clase base virtual define constructores, debe proporcionar uno de estos dos constructores: un constructor sin parámetros un constructor que admita valores por defecto para todos

los parámetros. Las clases derivadas de una clase base virtual tienen

que ser definidas como herencia virtual.

Page 59: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

59Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo deHerencia virtual

Page 60: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

60Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Punteros a clases derivadas

Page 61: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

61Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Polimorfismo

Page 62: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

62Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Polimorfismo

El polimorfismo se refiere al hecho de que una misma función adopte múltiples formas. Esto se consigue por medio de la sobrecarga:

Sobrecarga de funciones:• un mismo nombre de función para distintas funciones.

a = Sumar(c,d);a = Sumar(c);

Sobrecarga de operadores:• un mismo operador con distintas funcionalidades.• Ejemplo: Sobrecargar el operador + sobre la clase cadena

para que permita concatenar dos de estos objetos:entero1 = entero2 + 5;cadena1 = cadena2 + cadena3;

Page 63: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

63Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de constructores

Solo en caso de que no definamos ningún constructor, tenemos el constructor por defecto.

Page 64: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

64Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de funciones

Tenemos 2 funciones costructor string().

Tenemos 4 posibles llamadas a 4 funciones diferentes strcmp(): 3 en la clase. 1 en la librería “string.h” de C.

Tenemos 2 funciones strcpy() en la clase.

Page 65: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

65Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de funciones

En la sobrecarga de funciones se desarrollan distintas funciones con un mismo nombre pero distinto código. Las funciones que comparten un mismo nombre deben

tener una relación en cuanto a su funcionalidad. Aunque comparten el mismo nombre, deben tener

distintos parámetros de manera que el compilador pueda distinguir entre las distintas funciones cuando encuentra una llamada. Éstos pueden diferir en : número tipo orden

El tipo del valor de retorno de una función no es válido como distinción. Esto es debido a que ese valor en C++ no es necesario

que sea recogido por otro objeto.

Page 66: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

66Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ejemplo de sobrecarga de funciones

Page 67: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

67Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de operadores

Consiste en definir nuevas funcionalidades para los operadores definidos en el lenguaje. Se pueden sobrecargar prácticamente todos los

operadores del lenguaje: No podemos inventar nuevos operadores. No podemos re-definir funcionalidades de los

operadores que ya están definidas

Page 68: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

68Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de operadores

Al menos uno de los operandos del operador sobrecargado debe ser una clase definida por nosotros La sobrecarga de operadores es un caso particular de

la sobrecarga de funciones: el operando de la izquierda puede pasar a ser el

propietario de la función, o bien el primer argumento de la función.

Page 69: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

69Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de operadores

Page 70: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

70Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Sobrecarga de operadores

Para cualquier clase que se defina, el compilador define el operador asignación “=“.

Cuando no me sirve, debo re-definirlo.

Page 71: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

71Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Operador incremento y decremento

Tiene dos posibles notaciones: prefija: ++a postfija: a++

Page 72: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

72Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Operador subíndice

Devolución de una referencia: Se debe devolver una referencia cuando queremos que

se pueda modificar el propio objeto que se devuelve.

Page 73: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

73Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Operador subíndice

Ejemplo de utilización de índices dobles.

Page 74: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

74Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Conversión de clases

Un constructor de Y que reciba X permite al compilador convertir objetos de la clase X en objetos de la clase Y.

Page 75: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

75Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Operadores de conversión

Los constructores de una clase X: permiten definir qué otras clases pueden ser convertidas

en la clase X. Los operadores de conversión que se definen en una

clase X: permiten definir en qué otras clases se pueden convertir

la clase x.

Page 76: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

76Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Operadores de conversión

Page 77: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

77Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ligadura dinámica Funciones virtuales:

Son una clase de sobrecarga de funciones, pero con la diferencia de:

• Sobrecarga de funciones: se decide que función se va a ejecutar en tiempo de compilación.

• Funciones virtuales: se decide en tiempo de ejecución (poliformismo en tiempo de ejecución).

Page 78: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

78Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Ligadura dinámica

Se ejecutará la función muestra() de alumno o de profesor dependiendo de la clase de objeto a la que apunte p (ligadura dinámica, en tiempo de ejecución).

La función persona::muestra() no se ejecuta porque es virtual y ha sido substituida en cada clase derivada.

Si no se hubiera definido como virtual la función muestra() en la clase persona se ejecutaría siempre persona::muestra()

Page 79: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

79Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Funciones virtuales

Cuando se define una función virtual: El prototipo debe ser el mismo en las clases base y derivadas.

Una función definida como virtual en una clase base: es virtual en todas sus clases derivadas, sea cual sea el nivel de

derivación. Puede ser re-definida o no en las clases derivada.

Page 80: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

80Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases abstractas

No tiene mucho sentido: definir código a la función figura:area() existan objetos de la clase figura

Solución: Podemos definir la clase figura como una clase abstracta.

Page 81: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

81Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Clases abstractas

Funciones virtuales puras: Las clases derivadas están obligadas a re-definirla.

Page 82: Programación Avanzada en C++ - · PDF file2008 © Luis Hernández Programación en Ingeniería Electrónica | Programacion Avanzada en C++ 3 Nuevas incorporaciones desde C Espacio

82Programación en Ingeniería Electrónica | Programacion Avanzada en C++2008 © Luis Hernández

Destructor virtual