Prof. Dr. Paul Bustamante

Documentos relacionados
Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante

Herencia y Polimorfismo en C++

Prof. Dr. Paul Bustamante

PROGRAMACIÓN EN JAVA

Prof. Dr.Paul Bustamante

Prof. Dr. Paul Bustamante

Tema 6: Memoria dinámica

Examen Junio- Grupo B Lunes 17 de Junio - Programación en C++ Pág. 1

Prof. Dr. Paul Bustamante

La Herencia. La primera línea de cada declaración debe incluir la sintaxis siguiente:

Prof. Dr. Paul Bustamante

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

3. LA HERENCIA. Necesidad de la herencia

Punteros y Memoria Dinámica II

Programación orientada a objetos I

Programación Orientada a Objetos en C++

Tema 6. Gestión dinámica de memoria

Introducción a la Programación orientada a objetos con C++

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

Tema 3. Herencia. Programación Avanzada. Jorge Badenas

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Objetivo N 2. Conocer la Estructura General de un Programa en C++ Estructura de Datos Prof. Egilde Márquez

APUNTES PROII 2º PARCIAL.

Polimorfismo. Métodos virtuales

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Programación C++ (5 Parte) Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad Nacional

Herencia y polimorfismo

Programación. Test Autoevaluación Tema 3

Tema: Plantillas en C++.

Capitulo V Listas Enlazadas

Prof. Dr. Paul Bustamante

Prácticas de Sistemas operativos

INTRODUCCIÓN A LA POO EN C++

PROGRAMACIÓN ORIENTADA A OBJETOS

Necesidad de la herencia pertenencia variedad is a has a herencia variedad definir una clase modificando una o más clases añadir nuevos miembros

Clases y Objetos en C++

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Prof. Dr. Paul Bustamante

Memoria Dinámica en C++

INSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++

Prof. Dr. Paul Bustamante

Tema: Herencia en C#.

UTN FRBA Algoritmos y Estructura de Datos Examen Final 13/02/2015. Apellido y nombre: Legajo: Cursó con Prof:

Estructuras Enlazadas AyED UTN-BA

Programación orientada a objetos. Resumen de Temas Unidad 5: Herencia

Escuela Politécnica Superior de Elche

Prof. Dr. Paul Bustamante

Memoria en C++ Punteros - Referencias Clases Y ahora, a trabajar! Memoria Dinámica en C++

Tema 2: Programación basada en Objetos

Tema: Herencia en C#.

Tema: Tipos Abstractos de Datos (TAD s) en C++.

Prof. Dr. Paul Bustamante

TEMA 5: Subprogramas, programación modular

Introducción a C++ Algoritmos y Estructuras de datos II Dra. Carmen Mezura Godoy. Febrero 2009

E s c u e l a P o l i t é c n i c a S u p e r i o r d e E l c h e

1. Juego del Ahorcado

INFORMATICA II PRIMER PARCIAL

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

Prof. Dr. Paul Bustamante

Transcripción:

Prácticas de C++ Practica Nº 07 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante

Practica Nº 07 Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1. Introducción... 1 1.1 Ejercicio 1: Herencia I... 1 1.2 Ejercicio 2: Estudio del ejercicio Herencia I... 2 1.3 Ejercicio 3: Herencia II... 2 1. Introducción. En esta práctica vamos a hacer algunos ejercicios de un nuevo tema: Herencia, visto esta semana en las clases de teoría. 1.1 Ejercicio 1: Herencia I En este ejercicio se van a aplicar los primeros conceptos de herencia dados en clase, para lo cual vamos a utilizar la Clase Empleado y derivar a partir de ella la jerarquía de clases de la siguiente figura. Debe Crear un proyecto llamado Ejer1 y los ficheros *.h y *.cpp de cada una de las clases. Empleado Operario Directivo A continuación se reproducen los ficheros del primer proyecto de la práctica: Oficial Tecnico // Fichero Empleado1.h Figura 1 Jerarquía de clases #include <string.h> class Empleado char nombre[40]; Empleado(char *name="") strcpy(nombre,name); void imprime_cargo() cout << " Cargo no definido" << endl; char *GetName() return nombre; ; // En este caso, al tener sólo una función y ser ésta muy simple // se ha decidido implementar todas las funciones como "inline" class Directivo : public Empleado Directivo(char *name="") strcpy(nombre,name); void imprime_cargo() cout << " es un directivo"<<endl; ; Debe implementar las demás clases con el fin de poder poner el siguiente código en main().

Practica Nº 07 Programación en C++ Pág. 2 // Fichero main.cpp // incluir ficheros.h que sean necesarios void main() Empleado Rafa("Rafa"); Directivo Mario("Mario"); Operario Anton("Anton"); Oficial Luis("Luis"); Tecnico Pablo("Pablo"); // El tipo del objeto determina la función que se llama cout << "Con nombres de objetos:\n" << endl; cout << Rafa.GetName(); Rafa.imprime_cargo(); cout << Mario.GetName(); Mario.imprime_cargo(); cout << Anton.GetName(); Anton.imprime_cargo(); cout << Luis.GetName(); Luis.imprime_cargo(); cout << Pablo.GetName(); Pablo.imprime_cargo(); Compile el proyecto y ejecútelo, observando la salida por consola. 1.2 Ejercicio 2: Estudio del ejercicio Herencia I En este ejercicio es importante que pueda ver la secuencia de creación de objetos, según el orden cómo se van ejecutando los constructores y destructores. Para ello debe poner en los constructores el código para que saque por consola qué constructor se está ejecutando. Debe hacer lo mismo con los destructores. Observará que la secuencia de creación y destrucción de objetos es inversa, esto es, los constructores de las clases base se ejecutan primero, mientras que los destructores de las clases base son los últimos en ejecutarse. Utilice el proyecto anterior para hacer este ejercicio. 1.3 Ejercicio 3: Herencia II Este ejercicio consiste en hacer uso de la herencia, para lo cual va a crear una clase CFicha que será la clase base, a partir de la cual empezará a derivar para hacer las demás clases. Tenga en cuenta que la clase CFichaLibro es clase derivada de CFicha y es clase base a su vez de la clase CFichaVolumen. CFichaLibro CFichaVolumen CFicha CFichaRevista Cada clase debe tener sus propios ficheros (usar Insert-New class para crear las clases): Clase Ficheros CFicha Ficha.h, Ficha.cpp CFichaRevista FichaRevista.h, FichaRevista.cpp CFichaLibro FichaLibro.h, FichaLibro.cpp CFichaVolumen FichaVolumen.h, FichaVolumen.cpp El programa principal main() debe estar en el fichero Biblioteca.cpp.

Practica Nº 07 Programación en C++ Pág. 3 La clase Base CFicha tiene una función miembro que heredan todas las clases y la utilizan de forma directa, ya que está declarada como protected, lo que hace que a su vez no sea accedida por otra función no miembro de la clase: char *AsignarCadena(char *pref ); A continuación se dan las características y el código de cada clase: Clase CFicha: Las características son: 1. Dos variables puntero miembro para almacenar la Referencia y el Título de la ficha. 2. Un método AsignarCadena para la reserva de memoria dinámica. 3. Un método VisualizarFicha para sacar los datos por consola. 4. El constructor y destructor (en él se libera la memoria asignada desde el constructor). //Ficha.h class CFicha char *pref, *ptitulo; char *AsignarCadena(char *pref); CFicha(char *r=0, char *tit=0); ~CFicha() delete [] pref; delete [] ptitulo; void VisualizarFicha(); ; Clase CFicha //Ficha.cpp CFicha::CFicha(char *pr, char *pt) pref = AsignarCadena(pr); ptitulo = AsignarCadena(pt); char *CFicha::AsignarCadena( char *pcad) char *tmp; if (pcad == NULL) return NULL; tmp = new char[strlen(pcad)+1]; strcpy(tmp,pcad); return tmp; void CFicha::VisualizarFicha() cout <<"\tref: " << pref << endl; cout <<"\ttitulo: "<<ptitulo<<endl; Clase CFichaLibro: Las características son: 1. Clase derivada de la clase CFicha. 2. Dos variables miembro puntero para almacenar el Autor y la Editorial del Libro. 3. Redefinir el método VisualizarFicha para sacar por consola los datos del libro. En este método usamos también el VisualizarFicha de la clase base, para no tener que escribir más código. 4. El constructor y destructor para asignar y liberar memoria. // FichaLibro.h class CFichaLibro: public CFicha char *pautor, *peditorial; CFichaLibro( char *pr=0, char *pt=0, char *pa=0, char *pe=0);

Practica Nº 07 Programación en C++ Pág. 4 ; ~CFichaLibro() delete [] pautor; delete [] peditorial; void VisualizarFicha(); //FichaLibro.cpp CFichaLibro::CFichaLibro( char *pr, char *pt, char *pa, char *pe) pautor = AsignarCadena(pA); //autor peditorial = AsignarCadena(pE); //editorial pref = AsignarCadena(pR); //referencia (de clase base) ptitulo = AsignarCadena(pT); //titulo //puede utilizar la llamada al constructor de la clase base para asignar los datos void CFichaLibro::VisualizarFicha() cout << "Libro:" << endl; CFicha::VisualizarFicha(); //de clase base CFicha cout << "\tautor: " << pautor << endl; cout << "\teditorial: " << peditorial << endl; Clase CFichaRevista: Las características son: 1. Clase derivada de la clase CFicha. 2. Dos variables miembro int Anyo, NumRevista, para representar el año y el número de la revista. 3. Redefinir el método VisualizarFicha, al igual que el de CFichaLibro, para representar los datos de la revista en la consola. 4. El constructor para copiar los datos. No es necesario destructor. Clase CFichaVolumen: Las características son: 1. Clase derivada de la clase CFichaLibro, con lo cual hereda todo lo de CFichaLibro y CFicha. 2. Sólo tendrá una variable miembro tipo int para representar el número del volumen (int NroVolumen), el cual debe ser también pedido en el constructor. 3. Redefinir el método VisualizarFicha y que llame a su vez al mismo método de CFichaLibro (el cual llama a su vez al método VisualizarFicha de CFicha). 4. El constructor adecuado para asignar los datos (Tampoco es necesario un destructor, ya que en esta clase no se asigna memoria, se hace en CFichaLibro). 5. Un nuevo método PedirDatos() para que el usuario pueda introducir todos los datos del volumen: NroVolumen, Autor, Editorial, Titulo y Referencia. Desde el constructor de una clase derivada se puede invocar al constructor de la clase base, de la siguiente forma, para dejarle que él haga las asignaciones correspondientes: CFichaVolumen::CFichaVolumen(int num, char*pa,char *pe, char *pr, char *pt) :CFichaLibro(pR,pT,pA,pE) NroVolumen = num; Como la clase CFichaVolumen deriva de CFichaLibro, se puede invocar directamente al constructor de dicha clase para pasarle las variables. Esto se hace antes de las

Practica Nº 07 Programación en C++ Pág. 5 llaves. Entonces, en nuestro constructor lo único que copiamos es la variable NroVolumen de esta clase. A continuación se da el código de main(), en el cual se construyen tres objetos de cada clase. De la clase base no se construye ningún objeto. Hace falta agregar los correspondientes ficheros de cabecera de cada una de las clases: //Biblioteca.cpp #include <iostream.h> #include fichalibro.h #include ficharevista.h #include fichavolumen.h void main() CFichaLibro lib1("1111","visual C++","Ceballos","RAMA"); CFichaRevista rev1("1112","programming C++",2000, 9); CFichaVolumen vol1(1,"1113","c++","bjarne","addison"); CFichaVolumen vol2; Vol2.PedirDatos(); //visualizar todos los datos lib1.visualizarficha(); rev1.visualizarficha(); vol1.visualizarficha(); vol2.visualizarficha(); La salida por consola sería de la siguiente forma: Figura 2 Salida por consola