- #include <iostream>
- #include <vector>
- #include <memory>
- #include <string>
- class Vehicle {
- public:
- std::string name() const { return name_; }
- int number_of_wheels() const { return number_of_wheels_; }
- virtual ~Vehicle() = default;
- protected:
- Vehicle(const std::string &name, int number_of_wheels)
- : name_(name), number_of_wheels_(number_of_wheels) {}
- std::string name_;
- int number_of_wheels_;
- };
- class Car : public Vehicle{
- public:
- Car(const std::string &name, int horsepower)
- : Vehicle(name, 4), horsepower_(horsepower) {}
- int horsepower() const { return horsepower_; }
- private:
- int horsepower_;
- };
- class Bike : public Vehicle {
- public:
- Bike(const std::string &name, bool has_derailleur)
- : Vehicle(name, 2), has_derailleur_(has_derailleur) {}
- bool has_derailleur() { return has_derailleur_; }
- private:
- bool has_derailleur_;
- };
- void display_vehicle_info(std::vector<std::unique_ptr<Vehicle>> a){
- for (int i = 0; i <=5; i++) {
- if(typeid (a) == typeid (Car)){
- Car &some_car = dynamic_cast<Car &>(*a[i]);
- std::cout << "car: " << some_car.name() << "has: " << some_car.horsepower() << " HP" << std::endl;
- }
- if(typeid (a) == typeid (Bike)){
- Bike &some_bike = dynamic_cast<Bike &>(*a[i]);
- std::cout << "bike: " << some_bike.name() << " - derailleur: " << some_bike.has_derailleur() << std::endl;
- }
- }
- }
- // if(typeid (a) == typeid (Car)){
- // Car *some_car = dynamic_cast<Car *>(a[i].get());
- // if (some_car != nullptr) { // cast successful
- // std::cout << i << ": HP" << some_car->horsepower() << std::endl;
- // } else { // nope
- // std::cout << i << ": not a Car" << std::endl;
- // }
- // }
- // if(typeid (a) == typeid (Bike)){
- // Bike *some_bike = dynamic_cast<Bike *>(a[i].get());
- // if (some_bike != nullptr) { // cast successful
- // std::cout << i << ": H_D" << some_bike->has_derailleur() << std::endl;
- // } else { // nope
- // std::cout << i << ": not a Bike" << std::endl;
- // }
- // }
- int main()
- {
- std::vector<std::unique_ptr<Vehicle>> vehicles;
- vehicles.emplace_back(std::make_unique<Bike>("Fixie", false));
- vehicles.emplace_back(std::make_unique<Car>("Porsche", 400));
- vehicles.emplace_back(std::make_unique<Bike>("Road Bike", true));
- vehicles.emplace_back(std::make_unique<Bike>("MTB", true));
- vehicles.emplace_back(std::make_unique<Car>("Passat", 115));
- display_vehicle_info(vehicles);
- }