#include <cstdio>

template <class T>
class Writer
{
  public:
    Writer()  { }
    ~Writer()  { }
 
    void write(const char* str) const
    {
      static_cast<const T*>(this)->writeImpl(str);
    }
};

class ConsoleWriter : public Writer<ConsoleWriter>
{
  public:
    ConsoleWriter() { }
    ~ConsoleWriter() { }
 
    void writeImpl(const char* str) const
    {
      printf("%s\n", str);
    }
};

class ConsoleWriterNoInheritance
{
  public:
    ConsoleWriterNoInheritance() { }
    ~ConsoleWriterNoInheritance() { }
 
    void write(const char* str) const
    {
      printf("%s\n", str);
    }
};


int main()
{
  ConsoleWriter writer;
  writer.write("Hello world");
  ConsoleWriterNoInheritance other_writer;
  other_writer.write("Other");
  return 0;
}