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