#include <iostream>
#include <vector>

class Car
{
public:
   virtual ~Car() {};

   virtual void drive() {};
};


class Porsche : public Car
{
public:
   virtual void drive()
   {
      std::cout << "Porsche just drives but not fast!" << std::endl;
   };

   void driveFast()
   {
      std::cout << "Porsche drives fast!" << std::endl;
   };
};


class Ford : public Car
{
public:
   virtual void drive()
   {
      std::cout << "Ford just drives but not fast!" << std::endl;
   };
};

int main () {

   std::vector<Car *> cars;
   cars.push_back(new Porsche()); /* implicit up-cast */
   cars.push_back(new Ford());    /* implicit up-cast */

   Car *     porscheAsCar = cars.at(0);
   Porsche * porsche      = dynamic_cast<Porsche *>(cars.at(0));

   porscheAsCar->drive();
   porsche->drive();
   porsche->driveFast();

   delete cars.at(0);
   delete cars.at(1);

   return 0;
}
