Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _TTFH_3500 en 16 Marzo 2019, 05:01 am



Título: [AYUDA] Como se de que tipo se creo una clase que deriba de otra
Publicado por: _TTFH_3500 en 16 Marzo 2019, 05:01 am
Código
  1. #include <random>
  2. #include <cstdio>
  3. #include <stdexcept>
  4.  
  5. class Vehiculo {
  6. public:
  7.  virtual ~Vehiculo() { }; // Clase abstracta
  8. };
  9.  
  10. class Automovil : public Vehiculo {
  11. public:
  12.  int matricula = 4409;
  13. };
  14.  
  15. class Bicicleta : public Vehiculo {
  16. public:
  17.  int cambios = 18;
  18. };
  19.  
  20. void MostrarAtrb(const Vehiculo& vehiculo) {
  21.  try {
  22.    const Automovil& car = dynamic_cast<const Automovil&>(vehiculo);
  23.    printf("Es un Automovil con matricula: %d\n", car.matricula);
  24.  } catch(std::bad_cast &e) {
  25.    printf("Error %s\n", e.what());
  26.  }
  27.  try {
  28.    const Bicicleta& bici = dynamic_cast<const Bicicleta&>(vehiculo);
  29.    printf("Es una Bicicleta con %d cambios\n", bici.cambios);
  30.  } catch(std::bad_cast &e) {
  31.    printf("Error %s\n", e.what());
  32.  }
  33. }
  34.  
  35. int main() {
  36.  Vehiculo vehiculo;
  37.  if (rand() % 2 == 0)
  38.    vehiculo = Automovil();
  39.  else
  40.    vehiculo = Bicicleta();
  41.  MostrarAtrb(vehiculo); // Como se de que tipo se creo el objeto???
  42.  return 0;
  43. }
  44.  

Ambas conversiones de tipo dan error.


Título: Re: [AYUDA] Como se de que tipo se creo una clase que deriba de otra
Publicado por: CalgaryCorpus en 16 Marzo 2019, 05:15 am
Una alternativa es que definas en la clase base un metodo virtual que se llame mostrar() o algo asi, y que todas las clases derivadas implementan, y con ello evitas tener que saber el tipo, solo dices vehiculo->mostrar(),  y ya.


Título: Re: [AYUDA] Como se de que tipo se creo una clase que deriba de otra
Publicado por: Loretz en 16 Marzo 2019, 06:59 am
En tu ejemplo, MostrarAtrb(vehiculo); recibe un objeto Vehicle, que no tiene ruedas ni cambios.

El tipo estático de tu objeto "vehiculo" (definido en tiempo de compilación) es Vehicle, y el tipo dinámico (definido durante la ejecución) también lo es. Y al hacer vehiculo = Automovil(); o vehiculo = Bicicleta(); se asigna a vehiculo sólo la parte común entre un tipo y el otro. Es lo que se llama "Objet slicing".

El dynamic_cast va a fallar siempre.



Título: Re: [AYUDA] Como se de que tipo se creo una clase que deriba de otra
Publicado por: srWhiteSkull en 16 Marzo 2019, 10:01 am
Una alternativa es que definas en la clase base un metodo virtual que se llame mostrar() o algo asi, y que todas las clases derivadas implementan, y con ello evitas tener que saber el tipo, solo dices vehiculo->mostrar(),  y ya.
cierto.

pd sigo pensando que el foro debería tener un marcador de votos positivos para las publicaciones, si no destacarla cambiando el orden al menos resaltarla o poner un marcador, me evitaria el mensaje  :laugh: