#include <iostream>
using namespace std;

struct IStr
{
    virtual std::ostream& beginMessage() = 0;
    //virtual std::ostream& endMessage(std::ostream&) = 0;
};

struct MyStr : public IStr
{
    std::ostream& beginMessage() override { return std::cout; }
    static std::ostream& endMessage(std::ostream& ss) { return std::endl(ss); }
};

int main() {
	IStr * pStr = new MyStr();
	pStr->beginMessage() << "Hello World!" << MyStr::endMessage;
	return 0;
}