#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgQ2FyCnsKcHVibGljOgogICB2aXJ0dWFsIH5DYXIoKSB7fTsKCiAgIHZpcnR1YWwgdm9pZCBkcml2ZSgpIHt9Owp9OwoKCmNsYXNzIFBvcnNjaGUgOiBwdWJsaWMgQ2FyCnsKcHVibGljOgogICB2aXJ0dWFsIHZvaWQgZHJpdmUoKQogICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiUG9yc2NoZSBqdXN0IGRyaXZlcyBidXQgbm90IGZhc3QhIiA8PCBzdGQ6OmVuZGw7CiAgIH07CgogICB2b2lkIGRyaXZlRmFzdCgpCiAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJQb3JzY2hlIGRyaXZlcyBmYXN0ISIgPDwgc3RkOjplbmRsOwogICB9Owp9OwoKCmNsYXNzIEZvcmQgOiBwdWJsaWMgQ2FyCnsKcHVibGljOgogICB2aXJ0dWFsIHZvaWQgZHJpdmUoKQogICB7CiAgICAgIHN0ZDo6Y291dCA8PCAiRm9yZCBqdXN0IGRyaXZlcyBidXQgbm90IGZhc3QhIiA8PCBzdGQ6OmVuZGw7CiAgIH07Cn07CgppbnQgbWFpbiAoKSB7CgogICBzdGQ6OnZlY3RvcjxDYXIgKj4gY2FyczsKICAgY2Fycy5wdXNoX2JhY2sobmV3IFBvcnNjaGUoKSk7IC8qIGltcGxpY2l0IHVwLWNhc3QgKi8KICAgY2Fycy5wdXNoX2JhY2sobmV3IEZvcmQoKSk7ICAgIC8qIGltcGxpY2l0IHVwLWNhc3QgKi8KCiAgIENhciAqICAgICBwb3JzY2hlQXNDYXIgPSBjYXJzLmF0KDApOwogICBQb3JzY2hlICogcG9yc2NoZSAgICAgID0gZHluYW1pY19jYXN0PFBvcnNjaGUgKj4oY2Fycy5hdCgwKSk7CgogICBwb3JzY2hlQXNDYXItPmRyaXZlKCk7CiAgIHBvcnNjaGUtPmRyaXZlKCk7CiAgIHBvcnNjaGUtPmRyaXZlRmFzdCgpOwoKICAgZGVsZXRlIGNhcnMuYXQoMCk7CiAgIGRlbGV0ZSBjYXJzLmF0KDEpOwoKICAgcmV0dXJuIDA7Cn0K