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