+ All Categories
Home > Documents > Informática II

Informática II

Date post: 11-Jan-2016
Category:
Upload: sharis
View: 37 times
Download: 2 times
Share this document with a friend
Description:
Informática II. Clase 2: Clases y Objetos. Diego Fernando Serna Restrepo. Semestre 2011/2. Quiz. Contenido. Programación orientada a objetos - POO. 1. Clases y Objetos. 2. Punteros y Referencias. 3. Manejo de errores. 4. Contenido. Funciones Avanzadas. 5. Herencia. 6. - PowerPoint PPT Presentation
142
Informática II Clase 2: Clases y Objetos 1 Diego Fernando Serna Restrepo Semestre 2011/2
Transcript

Informática II

Clase 2: Clases y Objetos

1Diego Fernando Serna Restrepo Semestre 2011/2

2

QuizInformática II 2011/2

3Informática II 2011/2

4

Contenido

Informática II 2011/2

Programación orientada aobjetos - POO1

Clases y Objetos2

Punteros y Referencias3

Manejo de errores4

5

Contenido

Informática II 2011/2

Funciones Avanzadas5

Herencia6

Arreglos7

Polimorfismo8

6

Programación orientada a objetos - POO

• El mundo real esta compuesto por elementos complejos, difícilmente pueden ser modelados por números simples o caracteres.

• La esencia de la POO es

modelar objetos (cosas o conceptos)

en vez de datos.

Informática II 2011/2

Informática II 2011/27

Programación Orientada a Objetos

•Propuesta de programación que se basa en la creación de objetos y la cooperación entre los mismos.

Def

inic

ión

•Herencia

•Abstracción

•Polimorfismo

•Encapsulamiento.

Car

acte

ríst

icas

8

Programación Orientada a Objetos

Informática II 2011/2

•Es la creación de nuevas clases partiendo de una jerarquía de clases ya existente. Mecanismo fundamental para implementar la reutilización

Herencia

• Caraterísticas•C

onsiste en aislar un objeto (sistema modular).

Abstracción

•Capacidad que puede ser implementada en las clases la cual permite utilizar un mismo método de forma diferente

Polimorfismo

•Ocultamiento de los atributos de un objeto. Sólo es posible cambiarlos mediante las operaciones definidas para ese objeto

Encapsulamiento

9

Contenido

Informática II 2011/2

Programación orientada aobjetos - POO1

Clases y Objetos2

Punteros y Referencias3

Manejo de errores4

10

Clases

Las clases son simplemente una colección de variables (usualmente de diferentes tipos), combinados con un conjunto de funciones.

La base de la encapsulación.

Las clases son capaces de encapsular todo tipo de variables, incluso otras clases.

Las clases tienen variables miembro y funciones miembro.

Informática II 2011/2

11

Clases

• Son las variables de la clase, ej. int ruedas, float altura, etc...

Variables o datos miembro:

• Son las acciones que las clases pueden realizar, ej. Maullar, correr, volar, etc..

Funciones miembro o métodos:

Informática II 2011/2

Los miembros de una clase puede ser catalogados como públicos o privados.

12

Cómo acceder a los miembros de una clase?• Los miembros de una clase pueden

accederse cuando existe un objeto definido como dicha clase, y se accede utilizando el operador punto (.)

Gato Tom;

Tom.Maullar();

• ¡Cuidado!, no trate de asignar valores a las

clases, los únicos que pueden tener valores

son los objetos.

Informática II 2011/2

13

Métodos de las clases

• La declaración e implementación de los métodos de una clase es prácticamente igual a la definición de una función regular.class Gato

{

public:

int ObtenerEdad(); //declaración del método

private:

int suEdad;

}

//Implementación del método

int Gato::ObtenerEdad() //Operador SCOPE ::{

return suEdad;

}

Informática II 2011/2

14

Métodos de las clases// Declaracion de una clase

class Rectangulo {

// Variables de instancia

int ancho, alto;

public:

// Metodos

void set_values(int a, int b);

int area();

}; // Fin de clase Rectangulo

Informática II 2011/2

void Rectangulo::set_values(int a, int b) { ancho = a; alto = b;

}

int Rectangulo::area() { return ancho*alto;

}

15

Constructores y destructores

• Los constructores y destructores son métodos especiales de las clases, usados para inicializar y liberar la memoria de las clases respectivamente:

Informática II 2011/2

class Gato{Public: Gato(); //Declaración de un constructor ~Gato(); //Declaración de un destructor}

16

Constructores y destructores

• Los constructores pueden tomar parámetros de entrada, los destructores ¡NO!

• Es una buena práctica declarar los destructores, si se declaran los constructores.

Informática II 2011/2

17

Operador Scope (::)

Permite el acceso a una variable global aunque exista una variable local con el mismo nombre. El uso de :: delante del nombre de la variable, indica al compilador que debe utilizar la variable global, en lugar de la local

También Se usa para indicar pertenencia.

Informática II 2011/2

18

Función inline• C++ permite sustituir, en tiempo de compilación, la

llamada a una función por el código correspondiente en el punto en que se realiza la llamada. De esta manera la ejecución es más rápida, pues no se pierde tiempo transfiriendo el control y realizando conversiones de parámetros.

• Como contrapartida, el programa resultante ocupa más memoria, pues es posible que el código de una misma función se introduzca muchas veces. Las funciones inline son muy útiles en el caso de funciones cortas, que se ejecutan muchas veces (en un bucle for, por ejemplo).

Informática II 2011/2

19

Espacios nombres (namespace)

1 •Un espacio de nombres es un contexto en el que un grupo de uno o más identificadores pueden existir.

2 •Un identificador definido en un espacio de nombres está asociado con ese espacio de nombres.

3 •El mismo identificador puede independientemente ser definido en múltiples espacios de nombres

Informática II 2011/2

20

Resumen:

Informática II 2011/2

• Definición de los atributos y comportamiento de un tipo de objeto concreto.

Clase

• Conceptos:

• Es la instanciación de una clase.Objeto

• Son las propiedades que posee cada uno de los objetosAtributos

• Son cada uno de las funciones (comportamiento) de un objeto.Métodos

Informática II 2011/221

Estructura de un Programa

INICIO

FIN

Declaración de variables

Acciones del Algoritmo

Encabezados

Directivas

//Mi primer programa en C++#include <iostream>using namespace std;

int main(void){

int a, b, c = 0;

cout << “Digite el primer numero: ”; cin >> a; cout << “Digite el segundo numero: ”); cin >> b; c = a + b; cout << “El resultado es: << c <<‘\n’; return 0; }

Locales-Automaticas

Una variable local se declara dentro de una función, son visibles solo dentro de la funcion

Ocultan a las variables globales con el mismo nombre.

“Nacen” y “mueren” con la función. A no ser que se declaren (static)

Variables

• Es posible crear arreglos de tantas dimensiones como requieran sus aplicaciones.•Se declaran siguiendo el patrón de la declaración de un vector:

tipo nombre [d1] [d2] [d3]… [dN];

Arreglos

Informática II 2011/223

int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, {{2,4,6}, {8,10,12}},

{{3,7,11}, {15,19,23}} };

Fila 0 Fila 1

1 3 5

7 9 11

Bloque 0

Bloque 1

Bloque 2

2 4 6

8 10 12

3 7 11

15 19 23

F0

F1

C0 C1 C2 C0 C1 C2 C0 C1 C2

Bloque 0 Bloque 1 Bloque 2

Arreglos

Informática II 2011/224

1. Arreglos como parámetros a funciones

tipoRetorno funcion (tipoDato vector[]);

funcion (nombreVector);

tipoRetorno funcion (tipoDato vector[], int size);

funcion (nombreVector, tamaño);

Arreglos

Informática II 2011/225

struct nombreDeLaEstructura{ tipoDeDatoMiembro1 nombreMiembro1; tipoDeDatoMiembro2 nombreMiembro2; ... tipoDeDatoMiembroN nombreMiembroN;} ;

Con la declaración de un estructura estamos creando un tipo de datos NUEVO y PERSONALIZADO. Se utiliza la palabra clave struct

Estructuras

Cuando declaramos una estructura SOLO se está diciendo que forma tendrá, SE CREA UN NUEVO TIPO DE DATOS.

struct cdsMusica{ char titulo[40]; char artista[40]; char genero[15]; int numCanciones; int lanzamiento; int precio;};

struct cdsMusica cd1, cd2, cd3;

Falta instanciar la estructura o simplemente reservarle un espacio en memoria con un nombre especifico, SE DECLARA UNA VARIABLE DE ESTE NUEVO TIPO.

Estructuras

Estructuras

Si queremos a un elemento especifico dentro de una variable estructura se puede acceder por medio

del operador “.” ó “->”.

nombreVarEstructura.nombreMiembro = dato;

CADA MIEMBRO de una variable estructura se maneja como si fuera otra VARIABLE COMÚN Y CORRIENTE.

29

Contenido

Informática II 2011/2

Programación orientada aobjetos - POO1

Clases y Objetos2

Punteros y Referencias3

Manejo de errores4

30

• Es un tipo de variable implementada para almacenar exclusivamente direcciones de otras variables, estos se debe declarar y definir de acuerdo al tipo de dato que apunta.

Informática II 2011/2

Utilizando punteros un programa puede realizar muchas tareas que no sería posible utilizando tipos de datos estándar.

Punteros

El tipo de variable que almacena una dirección se denomina puntero.

• Un puntero es una variable como cualquier otra. Excepto que solo puede almacenar direcciones de otras variables común y corrientes.

• Un puntero apunta a una variable en memoria.• Son útiles para pasar y regresar valores a la rutina que

las llama.• Si son usadas incorrectamente se pueden convertir en

fuente de fallas y frustraciones.

Características de un apuntador

Informática II 2011/2

32

Punteros

Informática II 2011/2

Los punteros siempre deben inicializarse.

Aquellos punteros que son inicializados con un valor igual a cero (0), se denominan punteros NULL.

Se utiliza la palabra reservada VOID en la declaración de apuntadores, cuando se quiere que el puntero pueda apuntar a cualquier tipo de variables, int , char, float,….

Aquellos punteros que no sean inicializados a ningún valor se denominan “wild pointer”, y son extremadamente peligrosos pues pueden estar apuntando a cualquier cosa.

33

Violación de seguridad de la memoria

“Dangling pointer”

Un objeto apuntado se suprime sin modificar el puntero

Si se reasigna ese espacio libre en memoria, el puntero referenciará la

nueva variable (allocate),.

Informática II 2011/2

Generan corrupción de datos y posiblemente fallos de segmentación.

34

¿Para que se usan los punteros?

Ж •Manipular datos en el Free store (Heap).

Ж •Acceder a las variables miembro y métodos de un objeto.

Ж •Pasar variables por referencia a las funciones

Ж •Gestionar y administrar datos en memoria.

Ж •El utilizar punteros como valor de retorno permite superar la limitación de las funciones de devolver un único valor.

Informática II 2011/2

1000

1001

1002

1003

1004

1005

cout << " Dir y= " << &y << endl; / * visualiza dirección de y * /

cout << " y= " << y << endl; / * visualiza el valor de y * / cout << " y= " << y << endl; / * visualiza el valor de y * /

cout << " Dir y= " << &y << endl; / * visualiza dirección de y * /

Variables y memoria MEMORIA

25

77

1000

1001

1002

y

1003

1004

z

1005

#include <iostream>using namespace std;void main(){

}

int y = 25;int z=77;int y = 25;int z=77;

y = 25y = 25&y = 1002

Informática II 2011/2

36

Modo de almacenamiento• El modo de almacenamiento (storage class) es otra característica de las

variables de C++ que determina cuándo se crea una variable, cuándo deja de existir y desde dónde se puede acceder a ella.

Informática II 2011/2

•Es creada al comenzar a ejecutarse un bloque de código y deja de existir cuando el bloque se termina de ejecutar. (Por defecto)

Auto

•Estas variables existen durante toda la ejecución del programa. Una variable extern es definida o creada el momento en el que se le reserva memoria.•permiten transmitir valores entre distintas funciones y ficheros

Extern

•static se declaran dentro de un bloque como las auto, pero permanecen en memoria durante toda la ejecución del programa como las extern. La inicialización sólo se realiza la primera vez.

Static

•Este modo es una recomendación para el compilador, con objeto de que si es posible ciertas variables sean almacenadas en los registros de la CPU y los cálculos con ellas sean más rápidos.

Register

37

Espacios de memoria

Informática II 2009/2

Segmento de código

Memoria estática

Free store (Heap)

Espacio Libre

Stack (Pila)

Reservada antes de la ejecución del programa

Permanece fija.No requiere gestión

durante la ejecución.El sistema operativo se

encarga de la reserva, recuperación y reutilización.

Se accede a un espacio en esta cada vez que se declaran Variables globales o tipo static.

Es una zona de memoria que gestiona las llamadas a funciones durante la ejecución de un programa.

Cada vez que se realiza una llamada a una función en el programa, se crea un entorno de programa que se libera cuando acaba su ejecución.

La reserva y liberación de la memoria la realiza el S.O. de forma automática durante la ejecución del programa.

Es una zona de memoria donde se reservan y se liberan “trozos” durante la ejecución de los programas según sus propias necesidades, este proceso es usualmente llamado gestión de memoria dinámica.

Optimiza el almacenamiento de datos.

38

1 •Reservar memoria.

2 •Utilizar memoria reservada.

3 •Liberar memoria reservada.

Informática II 2011/2

Gestión dinámica de memoria

39

Operador new

• Un operador que reserva la cantidad de memoria deseada en tiempo de ejecución.

Informática II 2011/2

new reserva una zona de memoria en el Heap del tamaño adecuado para almacenar un dato de cualquier tipo, devolviendo la dirección de memoria donde empieza la zona reservada.

Si new no puede reservar espacio (Ej. no hay suficiente memoria disponible), se provoca una excepción y el programa termina.

La única forma de crear, modificar, acceder o eliminar una variable en el Heap es a través de un puntero.

Se puede gestionar memoria para almacenar variables de tipo predefinido (int, float, double, …) al igual que los tipos de datos creados por el usuario (estructuras, clases…).

40

Liberando la memoria del heap

• Para liberar la memoria del HEAP se usa el comando delete sobre el puntero.

delete pPuntero;

• Es MUY importante liberar la memoria del Heap, pues en caso de perder el rastro de los punteros podrán presentarse “fugas de memoria”

Informática II 2011/2

41

Operador delete

• El operador delete no elimina el puntero, simplemente lo desreferencia.

• Cuando se utiliza el operardo delete más de una vez, puede generar que el programa se estrelle, por ello es recomendable inicializar el puntero a NULL, haciendo esto se garantiza mayor seguridad, y de este modo se puede volver a reutilizar el puntero.

Informática II 2011/2

int *ptr =new int; //reserva memoriadelete ptr; //desreferncia ptrptr=NULL; //lo lleva a NULLdelete ptr; //no hay problema//se puede volver a referenciar a otro espacio de memoriaptr=new int;

42

Fugas de memoria

• Cuando “se pierde de vista” la dirección o el puntero que lleva registro del espacio en el Heap, se dice que hubo una fuga de memoria.

• La memoria desperdiciada por causa de fugas de memoria, NO podrá liberarse sino hasta que termine el programa.

Informática II 2011/2

43

Fugas de memoria

• Es muy frecuente que ocurra cuando el puntero es declarado como variable local (dentro de una función) y luego se sale de ésta sin antes liberar la memoria.

• Es muy común usar los constructores para reservar memoria en el heap y los destructores para liberarla.

• ¡OJO!, realizar un delete sobre un puntero libera la memoria, realizarlo de nuevo estrellará el programa. Para que esto no ocurra, asígnele al puntero el valor de cero DESPUÉS de hacer el primer delete.

Informática II 2011/2

44

Resumen de apuntadores

Expresión Lectura

*x Apuntado por x

&x Dirección de x

x.y Miembro y del objeto x

x->y Miembro y del objeto apuntado por x

(*x).y Miembro y del objeto apuntado por x

x[0] Primer objeto apuntado por x

x[1] Segundo objeto apuntado por x

x[n+1] Objeto (n+1) apuntado por x

Informática II 2011/2

45

Referencias

• Las referencias son “alias” de otros objetos, por lo tanto cuando se manipula una referencia, realmente se está manipulando el objeto al que ésta hace referencia.

Informática II 2011/2

46

Declaración de Referencias

int Edad = 5;

int &rVbleReferencia = Edad;

Informática II 2011/2

// int &rOtraVble = int // error!, esta mal referenciado

47

Referencias

• Las referencias difieren con otro tipo de variables ya que deben declararse inicializándolas con las variables a las que harán referencia. Si se tratan de declarar sin inicializar, el programa no compilará.

• Si se toma la dirección de una referencia (&rReferencia), el valor que devuelve es la dirección de la variable a la que apunta la referencia.

Informática II 2011/2

socio1, socio20X0FDE04

0X0FDE00

0X0FDE08

int socio1;int &socio2=socio1;

48

Referencias

• Las referencias SÓLO pueden ser asignadas una vez, por lo tanto, todas las operaciones que se hagan a la referencia, en realidad se estarán haciendo sobre el objeto al que hacen referencia.

• ¡NO TRATE DE REASIGNAR UNA REFERENCIA!

Informática II 2011/2

49

Referencias

• Las referencias pueden trabajar con todo tipo, incluso con objetos.

• Cuando una referencia hace referencia a un objeto, puede usar todos sus miembros y métodos tal y como se hace con objeto real.

Informática II 2011/2

50

Pasar y retornar valores por referencia

• A las funciones normalmente se le pasan los argumentos por valor y sólo devuelven un valor.

• Si se pasan los parámetros por referencia, se puede superar éstas limitantes. Existe dos formas de hacerlo; usando punteros o referencias

• Se dice que uno pasa “por referencia” cuando usa punteros o uno pasa “una referencia” cuando usa referencias.

Informática II 2011/2

51

Pasar y retornar valores por referencia

• Cuando se pasa por referencias, realmente se pasa la dirección del objeto real (en vez del objeto entero), para luego manipular directamente el objeto, no su copia.

Informática II 2011/2

52

Retornos múltiples valores en las funciones

• Existen 2 formas de hacerlo; pasar los objetos por referencia y trabajarlos dentro de la función o haciendo lo mismo pero con los punteros.

• Estos métodos permiten que se use el valor de retorno de la función para reportar errores.

Informática II 2011/2

53

Pasar por referencia para ser más eficiente

Informática II 2011/2

• Cada vez que se pasa un objeto por valor, se genera una copia de éste en la pila, lo cual hace que se requiera tiempo y memoria.

• Cuando se trabajan con valores sencillos(int, short, etc..), es un costo tribial; sin embargo, con objetos complicados es un costo significativos.

54

Pasando punteros const

Cuando se pasa un puntero de un objeto como parámetro de una función, ocurre el riesgo de

modificar la variable y sus métodos.

Para evitar este inconveniente se pueden usar punteros a objetos constantes, con el cual sólo se

podrá usar los métodos constantes, protegiendo sus miembros.

Informática II 2011/2

55

Cuando usar referencias o punteros

Informática II 2011/2

Referencias PunterosLas referencias generan un código mas limpio y fácil de usar

Trabajan directamente con posiciones de memoria

No pueden ser reasignados Se pueden reasignar, (reuso de punteros)

Las referencias no pueden ser nulas. Pueden tomar el valor de nulo en el flujo del programa

Poco costoso para manejo de funciones.

Poco costoso para manejo de funciones.

56

Contenido

Informática II 2011/2

Programación orientada aobjetos - POO1

Clases y Objetos2

Punteros y Referencias3

Manejo de errores4

57

Contenido

Informática II 2011/2

Funciones Avanzadas5

Herencia6

Arreglos7

Polimorfismo8

58

SOBRECARGADO DE FUNCIONES (POLIMORFISMO)

• Consiste en crear diferentes funciones con el mismo nombre, con el fin de ofrecer al usuario una manera más sencilla de recordar las funciones.

//Algunos protototipos

int funcion(int);

int funcion(long, long);

int funcion(long);/* El programa determina cual de las funciones “funcion” ha

sido llamada, según los parámetros con que sea llamada la función*/

Informática II 2011/2

59

SOBRECARGADO DE LOS MÉTODOS DE LAS CLASES

• Los métodos de las clases también pueden ser sobrecargados como el resto de las funciones, su sintaxis es prácticamente igual.

class Rectangulo

{

public:

// función DibujarFigura() sobrecargada de la clase

void DibujarFigura() const;

void DibujarFigura(int unAncho, int unaAltura) const;

private:

int suAncho;

int suAltura;

};

Informática II 2011/2

void DibujarFigura() const;

void DibujarFigura(int unAncho, int unaAltura) const;

60

SOBRECARGADO DE LOS MÉTODOS DE LAS CLASES

• Los constructores, al ser métodos especiales de las clases también pueden ser sobrecargados, y la manera de hacerlo es igual que el resto de los métodos.

• ¡OJO!, los destructores no pueden ser sobrecargados, ¿Porque?

Informática II 2011/2

Informática II 2011/261

VALORES POR DEFECTO

En el código anterior tenemos que uno de los constructores tiene argumentos de entrada

planteados por defecto

carro(int _gGas,char *_marca="mazda", int _velMax=80);

carro Deportivo(10,"Renault");Aquí no asignamos el último parámetro (int

_velMax) al constructor, este es asignado por defecto como 80.

Informática II 2011/262

VALORES POR DEFECTO

No es posible en la llamada de este constructor en particular, por ejemplo asignar un valor al tercer argumento si no ha sido asignado antes el valor del segundo argumento por defecto.

• carro Deportivo(10, ,50); //no tiene sentido

En cualquier función, o método de una clase es posible instaurar los argumentos por defecto.

63

INICIALIZACIÓN DE LAS VARIABLES MIEMBRO

Informática II 2011/2

Inicialización de variables

Etapa de inicialización

Posible asignar valores por referencia y const

Mas limpio y a menudo mas eficiente.

En el cuerpo del constructor

No se pueden inicializar referencias ni variables const pues genera error de

compilación

Puede contener expresiones y asignaciones

Informática II 2011/264

CONSTRUCTOR COPIA

• Adicionalmente de ser asignado por defecto un constructor y un destructor cuando no son declarados explícitamente en la declaración de la clase, el compilador provee un constructor de copia, que es llamado cada vez que se requiere una copia de un objeto.

#include <iostream>using namespace std;carro Deportivo(10,"BMW",50);//carro carreras=Deportivo;carro carreras(Deportivo); //constructor copia por

defectoint main(){

cout<<Deportivo.getVelMax()<<endl;cout<<carreras.getVelMax()<<endl;return 0;

}

5050

65

CONSTRUCTORES DE COPIA

• Cada vez que se crea una copia de un objeto "El constructor de copia” es ejecutado.

• Por defecto, el constructor de copia simplemente copia cada miembro de una objeto hacia el nuevo objeto. Esta copia se denomina “Copia Superficial”.

//Declaración del constructor de copia

GATO (const GATO &); // constructor de copia

Informática II 2011/2

Informática II 2011/266

1•Cuando se pasa un objeto como argumento a una función o esta lo retorna, se hace una copia temporal de cada una de sus variables miembro.

2•Todo constructor de copia, toma como parámetro una referencia a un objeto de su misma clase.•carro(carro &original);

CONSTRUCTORES DE COPIA

Informática II 2011/267

3• El objetivo del constructor de copia, es crear

una copia exacta de cada variable miembro del objeto pasado como referencia (original). Este copia se denomina “superficial”.

4• Los constructores de copia superficiales

funciona perfectamente cuando se trata de un objeto cuyas variables miembro no son punteros referenciados a variables u objetos alojados en el Heap (free store).

5• En algunas ocasiones se hace necesario

definir personalmente un constructor de copia, que evite que se haga una copia errónea, donde se garantice la independencia de cada objeto con respecto a cada una de sus variables miembro (copia profunda).

CONSTRUCTORES DE COPIA

68

SOBRECARGADO DE LOS OPERADORES

• La sobrecarga de operadores quiere decir que se pueden redefinir algunos de los operadores existentes en C++ para que actúen de una determinada manera, definida por el programador, con los objetos de una clase creada por el mismo.

• La sobrecarga de operadores se emplea para declarar “como es que funciona” dicho operador cuando se utilizan sobre los objetos.

Informática II 2011/2

2+1=0

69

SOBRECARGA DE OPERADORES

• El objetivo de la sobrecarga de operadores es simplificar al máximo el código a escribir, a cambio de complicar algo la definición de las clases. Una clase que disponga de operadores sobrecargados es una clase más compleja de definir, pero más sencilla e intuitiva de utilizar.

Informática II 2011/2

70

SOBRECARGA DE OPERADORES• La sobrecarga de un operador puede ser

declarada de la siguiente forma:

tipodeRetorno operator op (parametros);

Informática II 2011/2

void operator ++ (); // Ejemplo de una declaración para el sobrecargado del operador ++

Void, int, char, …

Palabrareservada

-, --, + , ++, =, ==, …

Void, int, char, …

Informática II 2011/271

1 •Es llamado a través del objeto cont1, el método que sobrecarga el operador preincremento (++).

2 •Dicho método incrementa la variable, y se retorna a sí mismo como referencia (contador&) .

3 •Es llamado el constructor de copia del objeto cont2, el cual recibe como argumento por defecto la referencia de un objeto del mismo tipo (cont1).

EJEMPLO SOBRECARGA DEL OPERADOR PREFIJO

En esta línea de código se presenta los siguientes pasos:contador cont2=++cont1;

Informática II 2011/272

SOBRECARGA DEL OPERADOR DE POSTINCREMENTO

1 •Creamos un objeto temporal copia del objeto original.

2 •Modificamos el valor de la variable del objeto original.

3 •Retornamos el objeto copia temporal.

De este modo, el valor del objeto será modificado, pero en la expresión donde aparezca se tomará el valor antes de modificar.

Informática II 2011/273

SOBRECARGA DE OPERADORES

1

• Un operador puede estar sobrecargado o redefinido varias veces, de tal manera que actúe de un modo distinto dependiendo del tipo de objetos que tenga como argumentos de entrada.

2

• Las ventajas de la sobrecarga de operadores terminan cuando se utiliza de modo que añade complejidad o confusión a los programas. Por ejemplo: no se deberá nunca utilizar el operador (-) para multiplicar matrices o el (+) para imprimir vectores.

3

• Los únicos operadores de C++ que no se pueden sobrecargar son:• El operador punto (.),• El if aritmético (?:)• El operador sizeof, • El scope operator (::)• puntero a miembro de un objeto (.*).

74

Contenido

Informática II 2011/2

Funciones Avanzadas5

Herencia6

Arreglos7

Polimorfismo8

Informática II 2011/275

HERENCIA

Diferentes tipos de objetos usualmente comparten características similares entre sí.

La herencia permite generar nuevos tipos, tomando como base alguno ya implementado.

También hace posible la implementación de jerarquías desde la generalización hasta la especialización de los objetos.

Informática II 2011/276

La programa

ción orientada a objetos permite a las clases heredar

las características y los comportamientos de otras clases

(variables miembro y

los métodos).

Adicionalmente C++, permite definir una

clase modificando una o

más clases ya existentes

.

Estas modificaciones consisten habitualmente en añadir

nuevos miembros

(variables o métodos) a la clase que

se está definiendo,

aunque también se

puede redefinir

variables o funciones

miembro ya existentes.

HERENCIA

Informática II 2011/277

• La clase de la que se parte en este proceso recibe el nombre de clase base, y la nueva clase que se obtiene se denomina clase derivada. Ésta a su vez puede ser clase base en un nuevo proceso de derivación, iniciando de esta manera una jerarquía de clases.

HERENCIA

Informática II 2011/278

CLASE BASE ABSTRACTA

De estas clases no se declara ningún objeto

Su función es la de agrupar miembros comunes de otras clases que se derivarán de ellas.

Por ejemplo, se puede definir la clase vehículo para después derivar de ella carro, moto, bicicleta, etc., pero todos los objetos que se declaren pertenecerán a alguna de estas últimas clases; no habrá vehículos que sean sólo vehículos.

Son Clases que no tiene otra utilidad que la de ser clase base para otras clases se deriven de ella.

La herencia presenta múltiples ventajas, como la posibilidad de reutilizar código sin tener que escribirlo de nuevo. Esto es posible porque todas las clases derivadas pueden utilizar el código de la clase base sin tener que volver a definirlo en cada una de ellas.

Informática II 2011/279

MODIFICADORES DE ACCESO

Tipo de dato de

la clase base

Clase derivada de una

clase base public

Clase derivada de una

clase base private

Otras clases sin relación de

herencia con la clase base

PrivateNo accesible directamente

No accesible directamente

No accesible directamente

Protected Protected PrivateNo accesible directamente

Public Public PrivateAccesible mediante operador (.) o (->)

Informática II 2011/280

NOTAS:

1 •Primero se debe crear la clase base, antes de tratar de crear clases que deriven de esta.

2 •El número de variables miembro de una clase derivada es mayor o igual que el de la clase base.

3•Hay algunos elementos de la clase base que no pueden ser heredados:•Constructores y destructores •Funciones friend •Funciones y datos estáticos de la clase •Operador de asignación (=) sobrecargado

Informática II 2011/281

CONSTRUCTORES Y DESTRUCTORES• Cuando un objeto derivado es creado primero es llamado

el constructor de la clase base y luego el propio.

int vel;

bool on;

int Ncambio;

int acelerar;

Parte vehículo

Objeto carro

Informática II 2011/282

SOBRECARGAR VS REDEFINIR

Cuando se sobrecarga

funciones, el nombre de la función

permanece, pero los argumentos de

entrada y de retorno pueden variar, al igual

que la implementación.

Cuando se redefine una función lo único que cambia es su

implementación. El encabezado

permanece igual (argumento de retorno

y firma) en la clase base como en la

derivada.

83

OCULTANDO LOS MÉTODOS DE LA CLASE BASE

Si la clase base contiene varios métodos sobrecargados, es decir métodos con nombres

iguales pero con argumentos e implementaciones diferentes, y

redefinimos uno de esos métodos dentro de una clase derivada, todos los métodos dentro de la clase base que respondan al mismo nombre

quedaran ocultos, es decir no se podrán acceder a través

del objeto derivado.

Informática II 2011/2

Informática II 2011/284

EJEMPLOclass vehiculo{protected:

int vel;bool on;

public:vehiculo();vehiculo(vehiculo &V);vehiculo(int _vel,bool _on);void setVel(int _vel);int getVel() const;//sobrecarga metodo getVelint getVel(float other);int getVel(int other);virtual vehiculo* clonar();virtual ~vehiculo();

};

class carro: public vehiculo{private:

int Ncambio;int acelerar;

public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();

};

carro audi(10,true);

int main(){

int a=5;float b=45.6;//solo podemos acceder a el método heredado redefinidoaudi.getVel();

audi.getVel(a);//para haceder a los demás métodos sobrecargadosaudi.vehiculo::getVel();audi.vehiculo::getVel(a);audi.vehiculo::getVel(b);return 0;

}

cuando se redefine un método

sobrecargado, todas sus variaciones

son escondidas. Si no se desea que

se oculten, entonces se debe

redefinir cada una de las variaciones

o sobrecargas en la clase derivada.

Informática II 2011/285

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

1 •Es posible realizar conversiones o asignaciones de un objeto de una clase derivada a un objeto de la clase base.

2 •Es decir se puede ir de lo más particular a lo más general, aunque en esa operación se pierda información, pues haya variables que no tengan a qué asignarse

3 •Por el contrario las conversiones o asignaciones en el otro sentido, es decir de lo más general a lo más particular, no son posibles, porque puede suceder que no se disponga de valores para todas las variables miembro de la clase derivada.

Informática II 2011/286

Objeto_claseBase= Objeto_claseDerivada;

Objeto_claseDerivada= Objeto_claseBase;

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

Se puede hacer referencia a un objeto de la clase derivada con su dirección contenida en un puntero a la clase base.

vehiculo *ptrV=new carro(30,true);

carro *ptrC=new vehiculo();

Informática II 2011/287

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

using namespace std;

int main(){

vehiculo *ptrV=new carro(30,true);

cout<< ptrV->getVel()<<endl;//se accede al metodo de la clase basereturn 0;

}

88

MÉTODOS VIRTUALES

• Tenemos un problema cuando deseamos acceder al método de la clase derivada a través de un puntero de tipo clase base. Para lograrlo debemos definir el método como virtual dentro de la clase base.

• Para declarar una función como virtual

basta con adicionar la palabra “virtual” al inicio de su prototipo.

Informática II 2011/2

virtual par.retorno declaracionMetodo(parámetros entrada );

Informática II 2011/289

Una vez que un método es declarado como virtual, lo seguirá siendo en las clases derivadas, es decir, la propiedad virtual se hereda

MÉTODOS VIRTUALES

Informática II 2011/290

Por cada clase que utiliza métodos virtuales, se genera una tabla por parte del compilador denominada v-table, que contiene la información de cada uno de los métodos definidos como virtuales.

Cada objeto creado de una clase que tenga una función virtual contiene un puntero oculto a la v-table de su clase. Mediante ese puntero accede a su v-table correspondiente y a través de esta tabla accede a la definición adecuada del método virtual.

En el caso de que en esa clase no esté definido el método virtual en cuestión, el puntero de v-table apuntará a la función virtual de su clase base más próxima en la jerarquía, que tenga una definición propia de la función virtual.

MÉTODOS VIRTUALES

Informática II 2011/291

Esto quiere decir que buscará primero en la propia clase, luego en la clase anterior en el orden jerárquico y se irá subiendo en ese orden hasta dar con una clase que tenga definido el método buscado.

Cuando el compilador llama el método virtual de la clase base, en vez del método de la case derivada, se dice que se presento un “Data Slicing”.

Las funcionalidades de los métodos virtuales, solo pueden ser usadas cuando se trabaja con punteros o referencias de la clase base.

MÉTODOS VIRTUALES

92

Contenido

Informática II 2011/2

Funciones Avanzadas5

Herencia6

Arreglos7

Polimorfismo8

DEFINICIÓN

Definición:• Un array es una colección de

variables del mismo tipo de datos con un mismo nombre.

• Los arrays son un ejemplo de una variable estructurada en la cual:– Hay un numero de piezas

de datos contenidos en el mismo nombre.

– Hay un método ordenado para la extracción de datos individuales del array

EJEMPLO ARREGLOS

Solución 1:Crear una variable especifica por empleado en la cual se almacene la identificación de cada uno de los empleados.

Problema:Supongamos el señor Burns le solicita a usted un programa que le permita llevar un registro de la identificación de cada uno de los empleados de la plata nuclear de Springfield, ¿Cómo lo haría?

EJEMPLO ARREGLOS

Problema solución anterior:El problema se vuelve mas difícil a medida que el numero de empleados aumenta, pues implicara la creación de mas variables individuales (id5, id6, …)

Solución al problema anterior:En los arrays se encuentra la respuesta. Pues un array es como una caja para guardar elementos o como un archivador. Utiliza un sistema de indexación para encontrar el valor de cada una de las variables almacenadas en su interior.

EJEMPLO ARREGLOS

Informática II 2009/297

ARREGLOS DE OBJETOS

• Los arreglos pueden guardar secuencias de datos de cualquier tipo, incluyendo los objetos.

• Si se desea usar un método de un objeto en un arreglo se usa el operador punto (.), tal como se hace con los objetos.

Carro carrosBacanos[2]; // ¡Debe existir un constructor

// por defecto que inicialice cada uno de los objetos!

carrosBacanos[0].acelerar();

ARREGLOS MULTIDIMENSIONALES

• Es posible crear arrays de tantas dimensiones como requieran sus aplicaciones.•Se declaran siguiendo el patrón de la declaración de un vector:

tipo nombre [d1] [d2] [d3]… [dN];

ARREGLOS DE 2 DIMENSIONES

•Declaración

•Ejemplo:tipo nombre [fila] [columna];

int A[2] [3];

A

A[0][0]Nombre

Columnas = 3

Filas = 2

A[0][1] A[0][2]

A[1][0] A[1][1] A[1][2]

A

A[0][0] A[0][1] A[0][2]

A[1][0] A[1][1] A[1][2]

A

A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]

ARREGLOS DE 2 DIMENSIONES

INICIALIZACIÓN ARREGLOS MULTIDIMENSIONALES

matrizA

A[0][0] A[0][1] A[0][2]

A[1][0] A[1][1] A[1][2]

int matrizA [2] [3] = { {3,5,7} , {8,6,4} };

Fila 0 Fila 1

3 5 7

8 6 4

int matrizA [2] [3] = { {3,5,7} , {8,6,4} };

int matrizA [2] [3] = { 3,5,7,8,6,4 };

B[0][0][2] B[0][1][2] B[0][2][2]

B[1][2][2]B[1][0][1] B[1][1][1]

B[0][0][1] B[0][1][1]

B[1][0][1] B[1][1][1] B[1][2][1]

B[0][2][1]

ARREGLOS DE 3 DIMENSIONES•Declaracióntipo nombre [fila] [columna] [Planos];

Int matrizB[2] [3] [3];

matrizB

B[0][0][0]Nombre

Columnas = 3

Filas =

2

B[0][1][0] B[0][2][0]

B[1][0][0] B[1][1][0] B[1][2][0]

Planos = 3

int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, {{2,4,6}, {8,10,12}},

{{3,7,11}, {15,19,23}} };

Fila 0 Fila 1

1 3 5

7 9 11

Bloque 0

Bloque 1

Bloque 2

2 4 6

8 10 12

3 7 11

15 19 23

F0

F1

C0 C1 C2 C0 C1 C2 C0 C1 C2

Bloque 0 Bloque 1 Bloque 2

ARREGLOS DE 3 DIMENSIONES

USO DEL HEAP PROBLEMAS DE MEMORIA

• Cuando se declara un arreglo, se separa un espacio en memoria fijo para almacenarlo.

• El arreglo se localiza en el stack (limitado).• Heap. Tiene más memoria.• Es posible crear estructuras que se

comportan de manera dinamica

• Arreglos en el heap– Arreglo de apuntadores.

• Diferencia entre apuntador a un arreglo y arreglo de apuntadores

1: CAT FamilyOne[500];2: CAT * FamilyTwo[500];3: CAT * FamilyThree = new CAT[500];

(3) es una variante de (1), muy distinta de (2).

USO DEL HEAP PROBLEMAS DE MEMORIA

• Uso de apuntadores con nombres de arreglos– Los arreglos son apuntadores constantes.

CAT Family[50];– Es un apuntador constante a

&Family[0];– Es legal usar nombres de arreglos como

apuntadores constantes y viceverza.

Family[4];Family + 4;

USO DEL HEAP PROBLEMAS DE MEMORIA

• Arreglos en el Free Store

delete [] Family;

107

DECLARANDO ARREGLOS EN EL HEAP

CAT *Family = new CAT[500];• Por ejemplo, usted puede escribir:

CAT *Family = new CAT[500];

CAT *pCat = Family; //pCat apunta a Family[0]

pCat->SetAge(10); // Establecer Family[0] a 10

pCat++; // avanzar a Family[1]

pCat->SetAge(20); // Establecer Family[1] a 20

Informática II 2011/2

108

LIBERANDO MEMORIA DEL HEAP

• Para liberar toda la memoria reservada por un arreglo en el heap, será necesario usar el comando “delete [ ]” sobre el puntero que apunta a la primera dirección del arreglo.

delete [ ] punteroRebano;

/* Notese que se utiliza los operadores [ ], en caso de no utilizarlos, solo se liberará el primer elemento del arreglo, generando así fugas de memoria*/

Informática II 2011/2

109

OTORGANDO TAMAÑO DE LOS ARREGLOS EN TIEMPO DE EJECUCIÓN• Cuando se utilizan arreglos que se

encuentren ubicados en el heap, será posible asignar su tamaño en tiempo de ejecución, otorgándole gran posibilidad de intercambio a los programas.

Gato pGato = new Gato [vble];

/* ¡Importante!, recuerde liberar la memoria cuando ya no se vaya a usar */

Informática II 2011/2

110

CLASE STRING

• Aunque muchas de las funciones heredadas de C pueden trabajar con los strings, éstas no implementan una solución orientada a objetos.

• En las bibliotecas estándares de C++, es posible encontrar una clase para manipular este tipo de datos. Se denomina la clase “String”.

Investigue al respecto.

Informática II 2011/2

Informática II 2011/2111

CLASE STRINGLa clase string está definida en la cabecera string

(#include <string>)

≠<string> <string.h>La cual no contiene la definición de la clase

string

<cstring.h>que contiene solo las

funciones para trabajar con strings terminados en NULL - por ejemplo para trabajar con char

cadena[45])

Si se incluye el módulo <iostream> no hace falta incluir <string>, porque la segunda está incluida en la primera. Incluir las dos no provoca error y mejora la legibilidad.

Informática II 2011/2112

CLASE STRING

• OperadoresFunciones miembroFunciones externas

http://www.cplusplus.com/reference/string/string/

113

LISTAS ENLAZADAS

• Aunque los arreglos son excelentes contenedores y pueden albergar cualquier tipo de datos, tienen el inconveniente de ser de tamaño fijo.

• Este problema puede arreglarse reasignando su tamaño dinámicamente en tiempo de ejecución; sin embargo, cuando haya que mover, liberar o reasignar memoria muchas veces, puede requerir muchos recursos del pc.

Informática II 2011/2

114

Listas enlazadas

• Las listas enlazadas son estructuras de datos que contienen pequeños contenedores diseñados para enlazarse unos a otros.

• La idea de esta estructura, es que cada uno de los objetos conoce la ubicación del siguiente objeto en la cadena.

Informática II 2011/2

115

Listas enlazadas

• Cada contenedor de la lista se denomina “nodo”.

• Al primer nodo de la lista se le denomina la “cabeza” de la lista, al último la “cola”.

• Existen tres tipos fundamentales de listas:– Enlazados de manera sencilla

– Doblemente enlazadas

– Arboles

Informática II 2011/2

116

Listas enlazadas de manera sencilla

• Cada nodo apunta al siguiente en la lista, nunca en el sentido contrario. Si se desea conocer el valor de un nodo particular, es necesario recorrer toda la lista nodo por nodo desde su inicio.

Informática II 2011/2

117

Listas doblemente enlazadas

• Son aquellas que permiten moverse tanto hacia el siguiente nodo como al anterior, pues en cada uno de ellos guarda dicha información.

Informática II 2011/2

118

Listas en árbol

• Permiten que cada nodo apunte a dos o más nodos.

Informática II 2011/2

119

Resumen

1 •Una arreglo es una colección de tamaño fijo de objetos que son todos del mismo tipo.

2 •Las matrices no hacen una comprobación de límites. Un error común es escribir para compensar n de una matriz de n miembros.

3

• Los arreglos pueden ser unidimensional o multidimensional. En cualquier caso, todos los miembros del arreglo se pueden inicializar, en cualquier tipo predefinido, tales como int, o los objetos de una clase que tiene un constructor predeterminado.

Informática II 2011/2

120

Resumen

1• Arreglos y su contenido puede estar en el

heap o en la pila. Si elimina un arreglo en el heap, recuerde utilizar los corchetes en la llamada a eliminar.

2• Los nombres de los arreglos son

punteros constantes que apuntan a los primeros elementos del arreglo. Apuntadores y arreglos usan punteros aritméticos para encontrar el siguiente elemento de una matriz.

3• Usted puede crear listas enlazadas para

gestionar colecciones cuyo tamaño no se conoce en tiempo de compilación. De las listas enlazadas, puede crear cualquier número de más estructuras complejas de datos.

4• Las Strings son arreglos de

caracteres( char). C + + proporciona características especiales para la gestión de arreglos tipo char, incluyendo la habilidad para inicializar con cadenas entre comillas.

Informática II 2011/2

121

Contenido

Informática II 2011/2

Funciones Avanzadas5

Herencia6

Arreglos7

Polimorfismo8

Informática II 2011/2122

Polimorfismo

Reescribir funciones Virtuales en las clases derivadas

Relacionar un objeto de una clase derivada con un puntero de clase base en tiempo de ejecución.

Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases

tipos polimórficos, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.

123

Polimorfismo

• Existen ocasiones en que se requiere que un objeto pueda heredar métodos o variables miembros de diferentes clases.

• Por ejemplo: ¿Que pasa si se tienen dos clases, clase Caballo y clase Pajaro, y se desea crear una nueva clase que tome lo mejor de cada uno de ellos para formar un pegaso?.

Informática II 2011/2

Informática II 2011/2124

Herencia Múltiple

• Es posible crear una nueva clase a partir de más de una clase base. Esto es llamado herencia múltiple .

class Derivada: public Base1, public Base2...{…..

}

Cuando una clase derivada hereda de múltiples clases bases, el compilador asignará la memoria suficiente para alojar sus características y las de sus clases base.

class Pegaso: public Caballo, public Pajaro{…..

}

Pegaso

Pájaro

Caballo

125

Constructores en la herencia múltiple

• En la etapa de inicialización de los constructores de la clase derivada , será posible declarar los constructores de la clase base que deberán ser llamados.

• ¿Que pasa si una clase derivada de varias clases base, hereda un método que tiene la misma firma en todas ellas?

Informática II 2011/2

126

Constructores en la herencia múltiple

• Si se trata de llamar un método heredado de varias clases cuya firma sea igual, el compilador lanzará un error de compilación.

• Existen dos alternativas para instanciar dichos métodos:

• Accediendo explícitamente al método de la clase base que se desea.

• Redefiniendo el método en la función derivada

Informática II 2011/2

127

Herencia de una clase base común

• Para que el compilador pueda compilar de manera adecuada, se deberá introducir explícitamente de cual clase base se tomarán dichos parámetros.

• Ambigüedad:

Int age = pPeg->GetAge();

• Solución:

Int age = pPeg->Horse:: GetAge();

O redeclararla en la clase derivada:virtual int GetAge()const { return Horse::itsAge; }

Informática II 2011/2

128

Herencia de una clase base común

• Cuando se hereda de clases que vengan de la misma línea de herencia, también existe el riesgo de caer en otro tipo de ambigüedad.

• ¿De cual clase superior común debe heredar una clase derivada?

Informática II 2011/2

Caballo Pájaro

Pegaso

AnimalAnimal

129

• class Horse : virtual public Animal• class Bird : virtual public Animal• class Pegasus : public Horse, public Bird

Informática II 2011/2

Herencia de una clase base común

Las clases bases heredadas virtualmente (animal) son inicializadas por sus clases derivadas que se encuentran más abajo en la jerarquía (pegasus).

Por ejemplo la clase base Animal no es inicializada por Horse o Bird sino por Pegasus. Horse y Bird tendrán que inicializar Animal en sus constructores, pero estas inicializaciones serán ignoradas cuando un objeto Pegasus sea creado.

130

Herencia virtual• Habrán ocasiones donde no se desee que una

clase derivada tenga dos copias de la misma clase base compartida.

• En C++ esto será posible declarando a la clase base como virtual.

Informática II 2011/2

Caballo Pájaro

Pegaso

Animal

131

Problemas con la herencia múltiple

• A pesar de que la herencia múltiple ofrece múltiples ventajas sobre la herencia simple, muchos desarrolladores son reacios a utilizarla, pues dicen que correr un debuger en estos sistemas es mucho mas complicado que en la herencia simple.

Informática II 2011/2

132

Tips con la herencia múltiple

1 •Usela sólo cuando verdaderamente necesite crear una clase que herede de múltiples clases.

2• Use herencia virtual

cuando las clases derivadas deban tener una sola instancia hacia su clase base compartida.

3• Cuando use herencia

virtual, asegúrese de inicializar la clase base compartida.Informática II 2011/2

133

Mezclas y clases de capacidad

• Las mezclas es una solución intermedia de la herencia múltiple y la herencia sencilla.

• Una clase de mezcla o capacidad, es una clase que adiciona funcionalidad sin agregar mayor o ningún dato adicional.

Informática II 2011/2

134

Tipos de datos abstractos (TDA)

• Un tipo de dato abstracto (abstract data type ADT) representa un concepto general, por lo tanto no es válido hacer una instancia de un ADT.

• Por ejemplo si se crea un dato abstracto llamado “figura geométrica” no tendría sentido crear un objeto de dicha clase por ser muy general, pero esta serviría como modelo o bosquejo para crear nuevas clases más especificas como “circulo” o “cuadrado”.

Informática II 2011/2

Informática II 2011/2135

• La idea de trabajar con clases abstractas es para agrupar en una clase común las capacidades que tendrán todas sus clases derivadas. Esto facilitará su uso para el usuario final de las clases.

Tipos de datos abstractos (TDA)

136

Tipos de datos abstractos (TDA)

• (TDA) – Funciones virtuales puras

• C++ soporta la creación de clases abstractas por medio del uso de “funciones virtuales puras” que por definición NO podrán ser accedidas directamente.

• //Declaración de funciones virtuales pura

virtual void funcionVirtualPura() { } = 0;Informática II 2011/2

137

Tipos de datos abstractos (TDA)

• (TDA) – Funciones virtuales puras

• Todas las funciones que sean declaradas como virtuales puras deberán ser redefinidas, o el compilador lanzará un error de compilación

• Ninguna función virtual pura podrá ser accedida directamente desde la clase base.

Informática II 2011/2

138

Implementación de funciones virtuales puras

• Aunque no sea posible instanciar directamente las funciones virtuales puras desde las clases abstractas, si será posible acceder a dichos métodos desde las clases derivadas.

Informática II 2011/2

139

Tips funciones virtuales puras

1 •Use tipos de datos abstractos para proporcionar una funcionalidad común en una serie de clases relacionadas.

2 •Sobreescriba todas las funciones virtuales puras en las clases derivadas.

3 •No trate de instanciar un objeto con tipo abstracto de datos(TDA).

Informática II 2011/2

140

Jerarquías complejas de abstracción• Existen ocasiones donde se puede desear

que una clase derivada de una clase abstracta, sea a su vez una clase abstracta, ya sea adicionando nuevos métodos virtuales puros o redefiniendo algunos de éstos.

• La idea de trabajar con clases abstractas es para agrupar en una clase común las capacidades que tendrán todas sus clases derivadas. Esto facilitará su uso para el usuario de las clases.

Informática II 2011/2

141

Bibliografía

• man, ¡no dude en utilizarlo!!• Como Programar en C++ - Deithel &

Deithel Ed. PRENTICE HALL• Sams Teach Yourself C++ in One Hour a

Day, J. Liberty,S. Rao, B. Jones

http://newdata.box.sk/bx/c/

Informática II 2011/2

142Informática II 2011/2

GRACIAS POR SU ATENCIÓN


Recommended