#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.
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.
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.
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: