Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Herencia en C++, llamando a Funciones heredadas

Estas en el tema de Herencia en C++, llamando a Funciones heredadas en el foro de C/C++ en Foros del Web. Hola , ya llevo tiempo programando en C++ y aun no domino plenamente la herencia por ejemplo Cita: class vehiculo { insertarllave(); encender(); } vehiculo::insertallave() ...
  #1 (permalink)  
Antiguo 23/03/2014, 20:43
 
Fecha de Ingreso: marzo-2014
Mensajes: 3
Antigüedad: 10 años, 1 mes
Puntos: 0
Herencia en C++, llamando a Funciones heredadas

Hola , ya llevo tiempo programando en C++ y aun no domino plenamente la herencia

por ejemplo
Cita:
class vehiculo
{
insertarllave();
encender();
}

vehiculo::insertallave()
{
cout<<"meter llave";
}
vehiculo::encender()
{
cout<<"girar llave para encender";
}
class carro_standard:vehiculo
{
meterclutch();
insertallave();
}
carro_standard:metercluth()
{
cout<<"pisar clutch";
}
carro_standar:insertallave();
{
cout<<"insertar llave"
meterclutch();
}
main()
{
vehiculo_standard vh;
vh.encender();
}
okey perdonen el C++ simplificado

Mi idea es que no requiero un procedimiento para definir encender porque esta definido en la clase base, pero en el programa que estoy realizando , la funcion encender no es capaz de llamar a insertarllave() de la clase derivada, llalma a insertarllave() de la clase base

o sea el carro no prenderia porque no meti el clutch, solo inserte la llave

no estoy seguro si el mecanismo del polimorfismo, si llamando a funciones virtuales pueda lograr que una funcion de una clase base llame a una funcion de una clase derivada

actualmente redefino la funcion encender en la clase derivada , pero no me convence del todo porque repito codigo
  #2 (permalink)  
Antiguo 24/03/2014, 07:47
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

pues que raro a mi si me sale bien...
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. class vehiculo {
  4.         public:
  5.         vehiculo(){}
  6.         ~vehiculo(){}
  7.            
  8.             void insertarllave() { std::cout << "BASE: meter llave" << std::endl; }
  9.             void encender()      { std::cout << "BASE: girar llave para encender" << std::endl; }
  10.        
  11. };
  12.  
  13.  
  14. class carro_standard : public vehiculo {
  15.         public:
  16.         void insertarllave() {  std::cout << "HEREDADA: insertar llave" << std::endl; meterclutch();}
  17.         void meterclutch()  {   std::cout << "HEREDAD:  pisar clutch" << std::endl;}
  18.        
  19. };
  20.  
  21. int main() {
  22.  
  23.     carro_standard vh;
  24.     vh.insertallave();
  25.     return 0;  
  26. }
Resultado:
HEREDADA: insertar llave
HEREDAD: pisar clutch

No es esto lo que quieres?

Última edición por vangodp; 24/03/2014 a las 08:32
  #3 (permalink)  
Antiguo 26/03/2014, 13:45
 
Fecha de Ingreso: marzo-2014
Mensajes: 3
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Herencia en C++, llamando a Funciones heredadas

Gracias por la ayuda
algo parecido es lo que me planteas, aunque tu redefines por ejemplo el procedimiento insertarllave() , pero en mi ejemplo yo no redefino el procedimiento encender() porque supongo que ya existe en la clase heredada

De hecho me faltaron funciones en el procedimento encender() para que se comprendiera el ejemplo, en mi concepcion para encender debemos

Código C++:
Ver original
  1. encender()
  2. {
  3.        insertarllave();
  4.        cout<<"girar llave";
  5. }

cuando yo uso la funcion encender solo utilizo la funcion insertarllave de la clase base, pero la funcion insertallave() yo la redefini para que tambien estuviera la funcion meterclutch()

Código C++:
Ver original
  1. vehiculo::insertallave()
  2. {
  3.         cout<<"inserta llave"
  4. }
en la redefinida yo agrego la funcion meterclutch en insertallave()


Código C++:
Ver original
  1. carro_standard::insertallave()
  2. {
  3.         cout<<"inserta llave";
  4.         meterclutch();
  5. }

pero no redefino la funcion encender
  #4 (permalink)  
Antiguo 26/03/2014, 20:54
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

Pues no se....
Lo veo chungo el tema.
No veo el motivo por el cual quieras acceder a una función de una clase derivada.Quizás esta función deba estar en la clase base también.
Pero si quieres acceder a ella una opción seria esta =D

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void foo();
  5.  
  6. class vehiculo {
  7.         public:
  8.         void insertarllave() {cout << "meter llave";}
  9.         void encender(){                   
  10.             cout << "girar llave para encender\n";
  11.             foo();
  12.         }              
  13. };
  14.  
  15. class carro_standard:public vehiculo {
  16.         public:
  17.         carro_standard(){}
  18.         ~carro_standard(){}    
  19.         void meterclutch()  { cout << "pisar clutch"; }
  20.         void insertallave() { cout << "insertar llave"; meterclutch(); }
  21.        
  22. };
  23.  
  24. //Funcion de acceso a la clase heredada =D
  25. void foo(){
  26.     carro_standard unCarro;
  27.     unCarro.meterclutch();
  28. }
  29.  
  30. main() {
  31.     carro_standard vh;
  32.     vh.encender(); 
  33. }
  #5 (permalink)  
Antiguo 27/03/2014, 01:01
 
Fecha de Ingreso: marzo-2014
Mensajes: 3
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Herencia en C++, llamando a Funciones heredadas

gracias por la ayuda

si esta algo raro, tu ejemplo correria si no me equivoco otro carro, ya que define otro carro en la funcion, no el carro que yo pretendo correr

pero tal vez tengas razon y estoy pidiendole demasiado al mecanismo de herencia, actualmente yo redefino la funcion encender en la clase heredada y agrego la funcion sobrecargada que quiero llamar, tecnicamente se ven iguales la funcion encender en ambas clases solo que cuando yo corro encender del vehiculo que hereda , la funcion encender() utiliza las nuevas funciones sobrecargadas

pero tenia dudas si estaba desperdiciando los recursos que da C++ para crear clases, no estoy seguro si declarar virtuales las funciones puede ayudar a ahorrar codigo

yo nunca he usado funciones virtuales , ni tampoco la herencia multiple, me ha bastado con herencia y composicion de objetos
  #6 (permalink)  
Antiguo 27/03/2014, 01:17
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

-_-'
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. class carro_standard;
  4. void foo(carro_standard &C);
  5.  
  6.  
  7. class vehiculo {
  8.    
  9.         public:
  10.         void insertarllave() {cout << "meter llave";}
  11.         void encender(carro_standard & unCarro){                   
  12.             cout << "girar llave para encender\n";
  13.             foo(unCarro);
  14.         }              
  15. };
  16.  
  17.  
  18. class carro_standard:public vehiculo {
  19.         public:
  20.         carro_standard(){}
  21.         ~carro_standard(){}    
  22.         void meterclutch()  { cout << "pisar clutch"; }
  23.         void insertallave() { cout << "insertar llave"; meterclutch(); }
  24.        
  25. };
  26. //Funcion de acceso a la clase heredada =D
  27. void foo( carro_standard & C ){
  28.     C.meterclutch();
  29. }
  30.  
  31. main() {
  32.     carro_standard vh;
  33.    
  34.    
  35.     vh.encender(vh);
  36.    
  37. }


  #7 (permalink)  
Antiguo 27/03/2014, 10:57
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Herencia en C++, llamando a Funciones heredadas

Si quieres comportamiento modificado en la clase derivada, pero quieres que el metodo invocado reaccione de acuerdo al tipo de objeto, tienes que definir en la clase base el metodo (o los metodos) como virtuales.

Si tuvieras una funcion

Código C++:
Ver original
  1. void f( Vehiculo* pvehiculo ) {
  2.      pvehiculo->metodo_virtual();
  3. }

esta funcion trabajaria tanto con vehiculos como con derivados de este, y se invocaría siempre el metodo mas "cercano" (en el caso de los derivados, el metodo definido en esa particular clase).

El no definirlo virtual hará que la función mostrada siempre invoque el método de la clase base, y necesitarías otra(s) función(es)para invocar los derivados.

Entonces: Lo recomendable es que definas los métodos a redefinir como virtuales en la clase base.
__________________
Visita mi perfil en LinkedIn
  #8 (permalink)  
Antiguo 30/03/2014, 13:06
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

CalgaryCorpus Si! :D

¿Algo parecido a esto no?
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class vehiculo {  
  5.         public:
  6.         void insertarllave() {cout << "meter llave";}
  7.         //necesita metodo virtual =(
  8.         virtual void encender(){cout << "BASE!..Girar llave para encender\n\n";}              
  9. };
  10. class carro_standard:public vehiculo {
  11.         public:
  12.         void meterclutch()  { cout << "Pisar clutch\n\n"; }
  13.         void encender() { cout << "DERIBADA!..Girar llave para encender\n"; meterclutch(); }
  14. };
  15.  
  16.  
  17. int main() {
  18.     carro_standard miCarro;
  19.     //Recorte de objetos o "slicing"    
  20.     vehiculo& pVehiculo = miCarro; //Si paso carro como puntero o referencia accedo a la clase derivada
  21.     vehiculo objVeyculo = miCarro; //Si paso el obj accedo a la clase base.
  22.     //Importante...fijese que le paso el objeto derivado De 2 formas distintas y obtengo 2 resultados
  23.     //distintos segun quiera una cosa u otra, pero les paso a la clase "BASE" WTF!XD
  24.    
  25.     objVeyculo.encender();//Aqui comprobamos el objeto "miCarro" recortado que me da acceso a la clase base de "miCarro"
  26.     pVehiculo.encender();//Aqui comprobamos la referencia, que me da como resultado la clase derivada de "miCarro"
  27.     //Es un tema Bochornozo....Lea mucho sobre el antes de usar XDD  
  28.     return 0;
  29. }

Si le pasas un puntero/referencia o le pasas un objeto tienes dos funcionamientos distintos.
Muy interesante, estoy leyendo sobre eso. ^^
A ver si logro pillar el trankillo sobre el tema =D
  #9 (permalink)  
Antiguo 30/03/2014, 16:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Herencia en C++, llamando a Funciones heredadas

Cuando haces esto:

Código C++:
Ver original
  1. vehiculo objVeyculo = miCarro;

estas haciendo una copia, definiendo un nuevo objeto. No hay duda, para el compilador, que cuando invocas metodos de ese objeto, seran de la clase base.

En cambio, en la asignacion de la referencia, actuaran los metodos virtuales.
__________________
Visita mi perfil en LinkedIn
  #10 (permalink)  
Antiguo 30/03/2014, 17:16
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

¡Gracias!
Los forillos son una maravilla, sobretodo los artistas que andan por ellos :)
Voy pillando el truco.
El tema es interesante, aquí me voy a dejar el pellejo jeje.
Después para mejorar aun mas... jeje. Los tal constructores virtuales.
wuoo que dolor de cabeza XD
  #11 (permalink)  
Antiguo 30/03/2014, 18:34
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Herencia en C++, llamando a Funciones heredadas

Constructores virtuales? Creo que en C++ no existe un constructor en que sea necesario decir "virtual" y el que no hacerlo implique un comportamiento distinto.
Siempre se invoca el constructor mas cercano.

Distinto caso los destructores, que deberian ser siempre virtuales.
__________________
Visita mi perfil en LinkedIn
  #12 (permalink)  
Antiguo 30/03/2014, 19:51
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Herencia en C++, llamando a Funciones heredadas

Ya...es que no se puede según parece.
Es una jugada que hay que hacer. Algo como una copia del constructor pasando un puntero this y con esa copia es lo que dice los ejemplos que estoy mirando pfff
Aun no tengo ni idea >_<

Etiquetas: funcion, funciones, herencia, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:49.