Programacion en C++ Orientada a Objetos

Anuncio
Programacion en C++ Orientada a Objetos - Clase Practica 4
Nicolás Silva
11 de junio de 2007
1.
Herencia
Por medio de la herencia podemos hacer codigo reusable.
Permite crearnos una clase que herede todos los metodos de una clase base sin tener que reescribir el codigo.
Para que la herencia sea correcta, la clase base con la clase heredada deben tener una relacion tipo Es una.
La sintaxis para derivar una clase es la siguiente:
// RatedTableTennisPlayer derives from the TableTennisPlayer base class
class RatedTableTennisPlayer : public TableTennisPlayer
{
...
};
Al hacer esto, nos creamos una nueva clase la cual hereda todos los metodos de la clase base. Nota: No se
accede directamente a los metodos y variables privadas. Despues veremos como se hace esto.
Tenemos la opcion de reimplementar metodos si lo deseamos. Es decir escribir la implementacion de un metodo
que ya existe en la clase base.
Podemos agregar nuevos metodos y variables tambien.
Es importante notar que la implementacion del constructor tiene una pequeña diferencia a lo que estamos acostumbrados. La sintaxis es la siguiente:
RatedPlayer::RatedPlayer(unsigned int r, const char * fn, const char * ln, bool ht) : TableTennisPlaye
{
rating = r;
}
Antes de construir el objeto derivado, C++ construye el objeto base. Por lo tanto se llama primero al constructor del objeto base.
1.1.
Metodos virtuales
Cuando a un metodo lo le colocamos virtual en su declaracion, permitimos que al ser reimplementado dentro
de una clase heredada, se llame al metodo reimplementado, aun cuando la referencia o el puntero sea del tipo
de la clase base.
Siempre que una clase vaya a ser derivada debemos denir el destructor en la clase base como virtual. De esta
forma llamaremos siempre al destructor adecuado.
De igual forma, siempre que reimplementemos un metodo, es conveniente denir en la clase base el metodo
como virtual.
1
1.2.
Protected
Cuando denimos metodos o variables como protected, estas pueden ser accedidas directamente por sus clases
derivadas.
1.3.
Ejercicio
Tenemos la siguiente declaracion de clase:
class Cd { // representa un disco de musica
private:
char artista[50];
char album[20];
int ncanciones; // numero de canciones
double duracion; // duracion del disco en minutos
public:
Cd(char * s1, char * s2, int n, double x);
Cd(const Cd & d);
Cd();
~Cd();
void Report() const; // reports all CD data
Cd & operator=(const Cd & d);
};
Derivar una clase Clasico la cual agregue un arreglo de caracteres que almacenara la cancion principal del CD. Si
la clase base requiere que alguno de los metodos sea virtual, modicarlo. Si alguno de los metodos de la clase base
no se necesita, removerlo. Finalmente testear el programa con el siguiente main.cpp:
#include <iostream>
using namespace std;
#include "classic.h"
// which will contain #include cd.h
void Bravo(const Cd & disk);
int main()
{
Cd c1("Beatles", "Capitol", 14, 35.5);
Classic c2 = Classic("Piano Sonata in B flat, Fantasia in C",
"Alfred Brendel", "Philips", 2, 57.17);
Cd *pcd = &c1;
cout < < "Using object directly:\n";
c1.Report();
// use Cd method
c2.Report();
// use Classic method
cout < < "Using type cd * pointer to objects:\n";
pcd->Report(); // use Cd method for cd object
pcd = &c2;
pcd->Report(); // use Classic method for classic object
cout < < "Calling a function with a Cd reference argument:\n";
Bravo(c1);
Bravo(c2);
cout < < "Testing assignment: ";
Classic copy;
copy = c2;
copy.Report()
return 0;
}
void Bravo(const Cd & disk)
{
disk.Report();
}
2
2.
Tarea
Tiempo para terminar la tarea.
3
Descargar