[AYUDA] Como se de que tipo se creo una clase que deriba de otra

Iniciado por _TTFH_3500, 16 Marzo 2019, 05:01 AM

0 Miembros y 1 Visitante están viendo este tema.

_TTFH_3500

Código (cpp) [Seleccionar]
#include <random>
#include <cstdio>
#include <stdexcept>

class Vehiculo {
public:
  virtual ~Vehiculo() { }; // Clase abstracta
};

class Automovil : public Vehiculo {
public:
  int matricula = 4409;
};

class Bicicleta : public Vehiculo {
public:
  int cambios = 18;
};

void MostrarAtrb(const Vehiculo& vehiculo) {
  try {
    const Automovil& car = dynamic_cast<const Automovil&>(vehiculo);
    printf("Es un Automovil con matricula: %d\n", car.matricula);
  } catch(std::bad_cast &e) {
    printf("Error %s\n", e.what());
  }
  try {
    const Bicicleta& bici = dynamic_cast<const Bicicleta&>(vehiculo);
    printf("Es una Bicicleta con %d cambios\n", bici.cambios);
  } catch(std::bad_cast &e) {
    printf("Error %s\n", e.what());
  }
}

int main() {
  Vehiculo vehiculo;
  if (rand() % 2 == 0)
    vehiculo = Automovil();
  else
    vehiculo = Bicicleta();
  MostrarAtrb(vehiculo); // Como se de que tipo se creo el objeto???
  return 0;
}


Ambas conversiones de tipo dan error.

CalgaryCorpus

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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Loretz

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.


srWhiteSkull

Cita de: 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.
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: