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

Saber el subtipo de un objeto

Estas en el tema de Saber el subtipo de un objeto en el foro de C/C++ en Foros del Web. Hola chicos, tengo el siguiente problema: Tengo un vector que almacena objetos de la clase "Objeto". Por otro lado tengo las clases "Esfera" y "Poliedro" ...
  #1 (permalink)  
Antiguo 20/12/2012, 16:46
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Saber el subtipo de un objeto

Hola chicos, tengo el siguiente problema:

Tengo un vector que almacena objetos de la clase "Objeto". Por otro lado tengo las clases "Esfera" y "Poliedro" que heredan de la clase "Objeto".

Cuando relleno el vector con esferas y poliedros, obviamente luego tengo un problema al recorrerlo, porque me coge los métodos de Objeto y no los de los hijos (que es justo lo que quiero).

En C# yo hacía virtual en los métodos del padre y override en los de los hijos y sin problemas, pero en c++ no sé cómo hacerlo.

He leído acerca del dynamic_cast y eso pero no acabo de comprenderlo, ¿me podéis aclarar en un ejemplo como sería?

Mil gracias.
  #2 (permalink)  
Antiguo 20/12/2012, 16:57
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Saber el subtipo de un objeto

Como haces actualmente el recorrido del vector? Casteas los elementos a "Objeto"?Podrias poner un código de ejemplo?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 20/12/2012, 17:13
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

Verás... voy creando instancias de la clase "Esfera" y las paso como parámetro a un método que recibe un "Objeto". Por tanto, estoy metiendo esferas en un vector de tipo "Objeto"... de manera que cuando recorro el vector, por ejemplo, dentro de un bucle digo: listaObj[i], solamente se llaman a los métodos de "Objeto". No hago ningún casting, simplemente como por definición una "Esfera" es un "Objeto", puedo añadirlo a la lista. ¿Me explico?

No tengo el código aquí!
  #4 (permalink)  
Antiguo 20/12/2012, 17:18
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

La cosa la recuerdo así:
...
Esfera *a = new Esfera ()

escena->add(a)
...
donde add está definido en la clase "Escena" y tiene esta pinta

void add(Objeto *o){...}

De manera que cuando recorro el vector de la clase "Escena" que tiene almacenados todos las instancias "Objeto" que se han creado, sólo puedo acceder a los métodos de "Objeto" y no de "Esfera", que es el tipo "real" de la instancia creada.

El vector a rellenar es así:

vector <Objeto> listaObj;
  #5 (permalink)  
Antiguo 21/12/2012, 04:28
 
Fecha de Ingreso: diciembre-2012
Ubicación: Madrid, pero soy de Las Palmas
Mensajes: 6
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Saber el subtipo de un objeto

Simplemente declara las funciones como virtuales en la clase Objeto asi en el vector<Objeto> que contiene esferas y poligonos que heredan de objeto al llamar a objeto.mifuncion() llamaria al de la clase hija si existiese esa función en la clase hija, si no llamará a la de la clase Objeto.

Muchas veces no tiene sentido que la clase Objeto implemente la funcion y deben implementarla solo las clases que heredan de ella. En este caso se trata de una clase Abstracta y habría que definir a la función como pura. igualandola a 0 en su declaración en la clase Objeto.

tipo MiFuncion(Parametros) = 0;

Obviamente solo puedes acceder por este vector a las funciones que existen en Objeto y no a las nuevas que implementen las clases heredadas.

Última edición por adrigm; 21/12/2012 a las 04:30 Razón: Añadir algo
  #6 (permalink)  
Antiguo 21/12/2012, 04:40
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

Debo hacer algo mal.

Ya tengo declarados los métodos en Objeto como virtual. ¿En los hijos deben ser virtual también?

Es que, tal y como está (virtual en el padre y no-virtual en los hijos), accede a los métodos de "Objeto" y no de los hijos.

Gracias, de veras.
  #7 (permalink)  
Antiguo 21/12/2012, 16:35
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

Sigo necesitando ayuda, gente
  #8 (permalink)  
Antiguo 23/12/2012, 03:39
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

... Nadie?
  #9 (permalink)  
Antiguo 23/12/2012, 03:56
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 13 años, 5 meses
Puntos: 32
Respuesta: Saber el subtipo de un objeto

Hola:

Cualquier curso o libro para principiantes de c++ te puede responder esas preguntas.
ejemplo: http://c.conclase.net/curso/index.php?cap=037#inicio

De todas formas un poco de código:
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Objeto {
  6. public:
  7.     virtual float areaVirtual(){return 0;}
  8.     virtual float areaAbstracta() = 0;
  9. };
  10.  
  11. class Esfera : public Objeto {
  12. public:
  13.     float areaVirtual(){return 1;}
  14.     float areaAbstracta(){return 1;}
  15. };
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.  
  20.     Objeto* o = new Esfera();
  21.     cout << "virtual: " << o->areaVirtual() << endl;
  22.     cout << "abstracta: " << o->areaAbstracta() << endl;
  23.  
  24.     return 0;
  25. }

slds;

Nup_
  #10 (permalink)  
Antiguo 23/12/2012, 08:31
 
Fecha de Ingreso: enero-2012
Mensajes: 87
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Saber el subtipo de un objeto

Es que es justo lo que hice, no sé si se me escapó algún detalle. Por eso pedía ayuda.

Gracias

Etiquetas: objeto
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 16:05.