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

Method overriding, Herencia y Vector.

Estas en el tema de Method overriding, Herencia y Vector. en el foro de C/C++ en Foros del Web. Buenas, venia a molestar con otra duda! La cosa es asi: Yo tengo 2 clases, Accion y Accion_dirigida(la Cual hereda, o deriva de Accion). Yo ...
  #1 (permalink)  
Antiguo 17/07/2011, 23:40
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 13 años, 4 meses
Puntos: 5
Method overriding, Herencia y Vector.

Buenas, venia a molestar con otra duda!
La cosa es asi:
Yo tengo 2 clases, Accion y Accion_dirigida(la Cual hereda, o deriva de Accion).
Yo necesito tener un vector que almacene punteros o instancias de Accion (Lo cual por logica, tambien debería admitir instancias o punteros de Accion Dirigida, por la herencia).

Esto es lo que tengo de Código:

Prueba.Cpp:
Código c:
Ver original
  1. #include <Juego/acciones.cpp>
  2. #include <vector>
  3. int main ()
  4. {
  5.     accion a;
  6.     a.ejecutor = "Pablo";
  7.     accion_dirigida b;
  8.     b.ejecutor = "jose";
  9.     b.objetivo = "Carlitos";
  10.     vector <accion> acciones;
  11.     acciones.push_back(a);
  12.     acciones.push_back(b);
  13.     acciones[0].ejecutar();
  14.     acciones[1].ejecutar();
  15.     wait(10);
  16. }

Acciones.h:

Código C:
Ver original
  1. #include <string>
  2. class accion
  3. {
  4.       public:
  5.       std::string ejecutor;
  6.       void ejecutar();
  7. };
  8.  
  9. class accion_dirigida : public accion
  10. {
  11.       public:
  12.       std::string objetivo;
  13.       void ejecutar();
  14. };

Acciones.cpp:

Código c:
Ver original
  1. void accion::ejecutar()
  2. {
  3.   cout << accion::ejecutor << " Ha ejecutado una accion comun" << endl;
  4.   return ;
  5. }
  6.  
  7. void accion_dirigida::ejecutar()
  8. { cout << accion_dirigida::ejecutor << " Ha ejecutado una accion dirigida a " << accion_dirigida::objetivo << endl; }


El problema, es que al almacenar una instancia de Accion_Dirigida, Ocurre un "Slicing", que causa que solo se almacene la parte de Accion de la Accion_dirigida, asi llamando al metodo Ejecutar() llama al metodo de Accion.


Lo que necesito seria una solucion a esto, estuve leyendo un buen rato y lo unico que encontre fue usar shared_Ptr´s , pero tampoco me funciono.

Agradeceria Muchisimo si alguno pudiera aportarme una solucion a mi problema.
Si no deje algo claro, pregunten con tranquilidad!

Muchas Gracias!

EDIT: Me olvide, el output de Prueba.cpp es:

"Jorge Ha Ejecutado una Accion Comun"
"Josesito Ha ejecutado una Accion Comun"

[en resumen, los outputs del Accion::ejecutar()]
  #2 (permalink)  
Antiguo 18/07/2011, 00:27
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Method overriding, Herencia y Vector.

El problema esta en que push_back() inserta copias de los elementos, y al hacer el vector un vector de acciones, se invoca el constructor de copia de la clase base.

Alternativa:
Hacer vector de punteros a accion

vector<accion*> v;

y en la clase base cambiar

void ejecutar();

por

virtual void ejecutar();

Al hacer push_back, cambias a insertar las direcciones de memoria

v.push_back( a ) cambia a v.push_back( &a )

Al invocar,

v[i].metodo() cambia a v[i]->metodo
  #3 (permalink)  
Antiguo 18/07/2011, 00:37
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 13 años, 4 meses
Puntos: 5
Respuesta: Method overriding, Herencia y Vector.

No se que decirte mas que Te quiero!
Muchas gracias! Me sacaste de la duda.
Ahora nomas tengoque aprender que es Por que se declara virtual, por que el operador ->.
Muchas gracias por la pronta respuesta , me dispongo a aprender lo que tenga que aprender.
Un abrazo, Pueden cerrar si quieren :)

Etiquetas: funcion, herencia, method
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 06:18.