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