#include <iostream>
#include <string>
class Action {
public:
virtual void exec() const = 0;
};
class HelloWorld : public Action {
public:
virtual void exec() const { std::cout << "Hello, World!" << std::endl; }
};
class Greeting : public Action {
public:
Greeting(const std::string &name) : m_name(name) {}
virtual void exec() const { std::cout << "Hello, " << m_name << "!" << std::endl; }
private:
std::string m_name;
};
void runAction(const Action &action = HelloWorld())
{
action.exec();
}
int main()
{
runAction();
runAction(HelloWorld());
runAction(Greeting("Ivan"));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgQWN0aW9uIHsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGV4ZWMoKSBjb25zdCA9IDA7Cn07CgpjbGFzcyBIZWxsb1dvcmxkIDogcHVibGljIEFjdGlvbiB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBleGVjKCkgY29uc3QgeyBzdGQ6OmNvdXQgPDwgIkhlbGxvLCBXb3JsZCEiIDw8IHN0ZDo6ZW5kbDsgfQp9OwoKY2xhc3MgR3JlZXRpbmcgOiBwdWJsaWMgQWN0aW9uIHsKcHVibGljOgogICAgR3JlZXRpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIDogbV9uYW1lKG5hbWUpIHt9CiAgICB2aXJ0dWFsIHZvaWQgZXhlYygpIGNvbnN0IHsgc3RkOjpjb3V0IDw8ICJIZWxsbywgIiA8PCBtX25hbWUgPDwgIiEiIDw8IHN0ZDo6ZW5kbDsgfQpwcml2YXRlOgogICAgc3RkOjpzdHJpbmcgbV9uYW1lOwp9OwoKdm9pZCBydW5BY3Rpb24oY29uc3QgQWN0aW9uICZhY3Rpb24gPSBIZWxsb1dvcmxkKCkpCnsKICAgYWN0aW9uLmV4ZWMoKTsKfQoKaW50IG1haW4oKQp7CiAgICBydW5BY3Rpb24oKTsKICAgIHJ1bkFjdGlvbihIZWxsb1dvcmxkKCkpOwogICAgcnVuQWN0aW9uKEdyZWV0aW5nKCJJdmFuIikpOwogICAgcmV0dXJuIDA7Cn0=