Tutorial de C++ - Herencia

13 - Herencia

[editar]
Tutorial creado por Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/
28 de Febrero de 2006
Como bien se sabe la herencia no se reparte: se descuartiza. Bromas aparte, la herencia constituye una de las herramientas mas poderosas del culto OO. Si una clase hereda de la otra, lo que hereda son todos sus atributos y metodos. Ademas de heredarlos puede sobreescribirlos, tanto los constructores-destructores como los metodos convencionales. Veremos un ejemplo claro que resume lo que se puede hacer y los efectos de la herencia Por un lado vemos la clase generica vehiculo y su descendiente: el coche. La clase Vehiculo

|| / * Vehiculo.hpp * Clase que define el objeto vehiculo * * Pello Xabier Altadill Izura * */ using namespace std; #include <iostream> enum tipo_combustible { QUEROSENO, CANNABIS, GIRASOL, GASOIL, AGUA, PLUTONIO }; class Vehiculo { protected: int cilindrada; tipo_combustible combustible; char *marca; public: Vehiculo(); Vehiculo(char *marca); Vehiculo(int cilindrada, tipo_combustible combustible, char *marca); ~Vehiculo(); Vehiculo(const Vehiculo &); void arrancar(); void mover(int metros); metodo tipo virtual, util cuando definamos PUNTEROS Y REFERENCIAS a vehiculo virtual void claxon() const { cout << "<clase vehiculo> Mec-meeec!! Que? meeec! Que de que? meec!" << endl; } char *getMarca() const {return this->marca;} tipo_combustible getCombustible() const {return this->combustible;} int getCilindrada() const {return this->cilindrada;} }; ||

Y su implementacion...

|| /
* Vehiculo.cpp * Fichero que implementa la clase vehiculo * * Pello Xabier Altadill Izura * * Compilacion: g++ -c Vehiculo.cpp */ #include "Vehiculo.hpp" Constructor Vehiculo::Vehiculo() { cout << "<clase vehiculo> Vehiculo creado" << endl; } Constructor Vehiculo::Vehiculo(char *marca) { this->marca = marca; cout << "<clase vehiculo> Vehiculo creado con parametro marca: " << marca << endl; } Constructor con valores iniciados Vehiculo::Vehiculo(int cilindrada, tipo_combustible combustible, char *marca) : cilindrada(cilindrada), combustible(combustible), marca(marca) { cout << "<clase vehiculo> Vehiculo creado con valores: " << endl; cout << "<clase vehiculo> cilindrada: " << cilindrada << endl; cout << "<clase vehiculo> combustible: " << combustible << endl; cout << "<clase vehiculo> marca: " << marca << endl; } Destructor Vehiculo::~Vehiculo() { cout << "<clase vehiculo> Vehiculo destruido" << endl; } Constructor copia de vehiculo Vehiculo::Vehiculo(const Vehiculo & vehiculoOrigen) {} Arrancamos el vehiculo void Vehiculo::arrancar() { cout << "<clase vehiculo> arrancando vehiculo. Brruum!!" << endl; } Movemos el vehiculo unos metros void Vehiculo::mover(int metros) { cout << "<clase vehiculo> moviendo vehiculo " << metros << " metros" << endl; } ||

El coche, herencia de Vehiculo

|| / * Coche.hpp * Clase que define el objeto Coche, hijo de vehiculo, se&ntilde;or del capitalismo * * Pello Xabier Altadill Izura * */ #include "Vehiculo.hpp" class Coche : public Vehiculo { protected: int caballos; char *motor; public: Atencion: constructor pasando parametros por defecto estilo guru pero invocando a su clase padre Coche():Vehiculo("Audi") { cout << "<clase coche> Coche destruido invocando al constructor vehiculo" << endl; } Constructor que sobreescribe al de vehiculo! Coche(char *marca); Constructor Coche(int cilindrada, tipo_combustible combustible, char *marca); Constructor Coche(int caballos, char *motor) { this->caballos = caballos; this->motor = motor; cout << "<clase coche> Coche construido con caballos y motor" << endl; } Destructor ~Coche(); Constructor copia Coche(const Coche &); Metodo sobreescrito void arrancar(); metodo que sobreescribe al virtual void claxon() const; getter/setter int getCaballos() const {return this->caballos;} inline char *getMotor() const {return this->motor;} inline }; ||

Y su implementacion

|| /
* Coche.cpp * Fichero que implementa la clase Coche * * Pello Xabier Altadill Izura * * Compilacion: g++ -c Vehiculo.cpp * g++ Coche.cpp Vehiculo.o -o Coche */ #include "Coche.hpp" Constructor de coche que sobreescribe Coche::Coche(char *marca) { cout << "<clase coche> Coche construido con marca: " << marca << endl; } Constructor de coche Coche::Coche(int cilindrada, tipo_combustible combustible, char *marca) { cout << "<clase coche> Coche construido con parametros" << endl; } Destructor de coche Coche::~Coche() { cout << "<clase coche> Coche destruido" << endl; } Constructor copia de Coche Coche::Coche(const Coche & cocheOriginal) { marca = new char; marca = cocheOriginal.getMarca(); cout << "<clase coche> Copia de coche" << endl; } metodo sobreescrito void Coche::arrancar () { cout << "<clase coche> BOOM! pam! pam! pret pret pret... pam! pret pret" << endl; } metodo que sobreescribe al virtual void Coche::claxon() const { cout << "<clase coche> MOOOOOC!! Mecagon tus muelas MOC-MOOOC!!" << endl; } Funcion principal int main () { Creamos varios coches. Veremos que al ser objetos heredados se invocaran los constructores, copias, y destructores de la clase padre Vehiculo Coche mibuga = Coche(); Coche tucarro = Coche(mibuga); probando constructor sobrescrito: se invocan los dos! Coche tequi = Coche("Alfalfa Romero"); podemos invocar los metodos del padre y usar sus atributos cout << "La marca de mi buga es: " << mibuga.getMarca() << endl; mibuga.arrancar(); Invocando metodo sobreescrito: solo se invoca el del coche. tucarro.arrancar(); Y si queremos invocar el metodo del padre?? tequi.Vehiculo::arrancar(); Creamos otro vehiculo con puntero a un COCHE Vehiculo *vehiculo = new Coche("LanborJini"); Esto invocara el metodo de vehiculo, el de la clase PADRE vehiculo->arrancar(); vehiculo->mover(3); Ahora queremos invocar el claxon, pero a cual de los metodos se invocara, al del Coche o al de la clase vehiculo? al haber definido el metodo claxon como virtual, se invocara el metodo correcto que es el del coche (vehiculo es un puntero a coche). vehiculo->claxon(); return 0; } ||

OUTPUT La salida de la ejecucion de Coche.cpp seria:

|| <clase vehiculo> Vehiculo creado con parametro marca: Audi <clase coche> Coche destruido invocando al constructor vehiculo <clase vehiculo> Vehiculo creado <clase coche> Copia de coche <clase vehiculo> Vehiculo creado <clase coche> Coche construido con marca: Alfalfa Romero La marca de mi buga es: Audi <clase coche> BOOM! pam! pam! pret pret pret... pam! pret pret <clase coche> BOOM! pam! pam! pret pret pret... pam! pret pret <clase vehiculo> arrancando vehiculo. Brruum!! <clase vehiculo> Vehiculo creado <clase coche> Coche construido con marca: LanborJini <clase vehiculo> arrancando vehiculo. Brruum!! <clase vehiculo> moviendo vehiculo 3 metros <clase coche> MOOOOOC!! Mecagon tus muelas MOC-MOOOC!! ||
[editar]

23 opiniones

yery cruz

12345
DamiaN

Mal exlicado :S,
no dice nada

agan algo de servicio por favor no mas estupidos
alegoria

cuando uno va a esplicar de progamacion primero se esplican los concepto, delas intrucciones,para que el estudiante sepa lo que se dice o de lo que se esta hablando, si es que esta pagina intructiva, sinoo no pongan estos ejemplo pues son tan astracto para los principiates que lo que hacen es asustarlos y seban , para esto de maestro, hay que ser humilde yno creer que como ya yo se no me importa lo que venga, no tomen esto, como algo mejoren, mejoren,mejoren, los quiero mucho migel.
Sobre nombre de array.

Hola, peter. Respecto a tu primera pregunta sobre cómo nombrar lo que en el código aparece como "array" en inglés, te puedo decir que no es correcta ninguna de las dos opciones que ofreces. Si se usa "arrays" se está españolizando la palabra inglesa "array". No muy conveniente, porque en español ya existe la palabra adecuada para ese concepto: "vector". De todos modos, españolizar una palabra inglesa en argot técnico no es tan grave como usar la palabra española traducida según una acepción inglesa incorrecta. Nunca se debería usar "arreglo".
1 2 3 4 5 | siguiente >

Tutoriales relacionados con 'Tutorial de C++'

Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de... Más »
Este tutorial presenta los conceptos básicos de líneas de transmisión (Transmission lines), así como una... Más »
Si tuviera que buscar un adjetivo para calificar a Sendmail, pensaría en "excesivo". Excesivo puesto... Más »
La red telefónica básica se creó para permitir las comunicaciones de voz a distancia. Esto... Más »
Bienvenidos al manual de HTML de Indaya.A través de todos estos capítulos vamos a descubrir... Más »

Autor y licencia de 'Tutorial de C++'


Tutorial de Peter Class; traducción por Pello Xabier Altadill Izura. Extraido de: http://es.tldp.org/Manuales-LuCAS/doc-tutorial-c++/html/ CopyLeft
Este documento se cede al dominio publico.
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.