#include <iostream>
class SpaceShip;
class MilleniumFalcon;
class Pilot
{
public:
virtual void operate(SpaceShip&)
{
std::cerr << "Operating spaceship" << std::endl;
}
virtual void operate(MilleniumFalcon&)
{
std::cerr << "Cannot operate that spaceship!" << std::endl;
}
};
class Chewbacca: public Pilot
{
public:
virtual void operate(SpaceShip&)
{
std::cerr << "Don't want to operate that low spaceship!" <<
std::endl;
}
virtual void operate(MilleniumFalcon&)
{
std::cerr << "Operating the Millenium Falcon" << std::endl;
}
};
class SpaceShip
{
public:
virtual void operate_by(Pilot& pilot) { pilot.operate(*this); }
};
class MilleniumFalcon: public SpaceShip
{
public:
virtual void operate_by(Pilot& pilot) override { pilot.operate(*this); }
};
void launch_ship(Pilot& pilot, SpaceShip& ship)
{
ship.operate_by(pilot);
}
int main()
{
Chewbacca chewie;
MilleniumFalcon millenium;
launch_ship(chewie, millenium);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKCmNsYXNzIFNwYWNlU2hpcDsKY2xhc3MgTWlsbGVuaXVtRmFsY29uOwoKCmNsYXNzIFBpbG90CnsKcHVibGljOgogICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRlKFNwYWNlU2hpcCYpCiAgICB7CiAgICAgICAgc3RkOjpjZXJyIDw8ICJPcGVyYXRpbmcgc3BhY2VzaGlwIiA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgdmlydHVhbCB2b2lkIG9wZXJhdGUoTWlsbGVuaXVtRmFsY29uJikKICAgIHsKICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCBvcGVyYXRlIHRoYXQgc3BhY2VzaGlwISIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKY2xhc3MgQ2hld2JhY2NhOiBwdWJsaWMgUGlsb3QKewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0ZShTcGFjZVNoaXAmKQogICAgewoKICAgICAgICBzdGQ6OmNlcnIgPDwgIkRvbid0IHdhbnQgdG8gb3BlcmF0ZSB0aGF0IGxvdyBzcGFjZXNoaXAhIiA8PAogICAgICAgICAgICAgICAgICBzdGQ6OmVuZGw7CiAgICB9CgogICAgdmlydHVhbCB2b2lkIG9wZXJhdGUoTWlsbGVuaXVtRmFsY29uJikKICAgIHsKICAgICAgICAgc3RkOjpjZXJyIDw8ICJPcGVyYXRpbmcgdGhlIE1pbGxlbml1bSBGYWxjb24iIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmNsYXNzIFNwYWNlU2hpcAp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRlX2J5KFBpbG90JiBwaWxvdCkgeyBwaWxvdC5vcGVyYXRlKCp0aGlzKTsgfQp9OwoKY2xhc3MgTWlsbGVuaXVtRmFsY29uOiBwdWJsaWMgU3BhY2VTaGlwCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIG9wZXJhdGVfYnkoUGlsb3QmIHBpbG90KSBvdmVycmlkZSB7IHBpbG90Lm9wZXJhdGUoKnRoaXMpOyB9Cn07CgoKdm9pZCBsYXVuY2hfc2hpcChQaWxvdCYgcGlsb3QsIFNwYWNlU2hpcCYgc2hpcCkKewogICAgc2hpcC5vcGVyYXRlX2J5KHBpbG90KTsKfQoKaW50IG1haW4oKQp7CiAgICBDaGV3YmFjY2EgY2hld2llOwogICAgTWlsbGVuaXVtRmFsY29uIG1pbGxlbml1bTsKCiAgICBsYXVuY2hfc2hpcChjaGV3aWUsIG1pbGxlbml1bSk7Cn0=