#include "iostream"
class Logger
{
public:
Logger(std::string name) : name_(name) {}
void log(std::string msg) { std::cout << name_ << ": " << msg << std::endl; }
private:
std::string name_;
};
template<typename T>
class LoggerImp : public Logger
{
public:
LoggerImp(const std::string& n) : Logger(n) {}
};
class B : private LoggerImp<B>
{
typedef LoggerImp<B> LL;
public:
B() : LoggerImp<B>("Class B" ) {}
void doSomethingInB()
{
LL::log("B doing something");
}
};
class C : public B, private LoggerImp<C>
{
typedef LoggerImp<C> LL;
public:
C() : LoggerImp<C>("Class C" ) {}
void doSomethingInC()
{
LL::log("C doing something");
}
};
int main()
{
B* b = new B();
C* c = new C();
b->doSomethingInB();
c->doSomethingInC();
c->doSomethingInB();
return 0;
}
I2luY2x1ZGUgImlvc3RyZWFtIgoKY2xhc3MgTG9nZ2VyCnsKcHVibGljOgogICAgTG9nZ2VyKHN0ZDo6c3RyaW5nIG5hbWUpIDogbmFtZV8obmFtZSkge30KICAgIHZvaWQgbG9nKHN0ZDo6c3RyaW5nIG1zZykgeyBzdGQ6OmNvdXQgPDwgbmFtZV8gPDwgIjogIiA8PCBtc2cgPDwgc3RkOjplbmRsOyB9CnByaXZhdGU6CiAgICBzdGQ6OnN0cmluZyBuYW1lXzsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIExvZ2dlckltcCA6IHB1YmxpYyBMb2dnZXIKewpwdWJsaWM6CiAgICBMb2dnZXJJbXAoY29uc3Qgc3RkOjpzdHJpbmcmIG4pIDogTG9nZ2VyKG4pIHt9Cn07CgpjbGFzcyBCIDogcHJpdmF0ZSBMb2dnZXJJbXA8Qj4KewogICAgdHlwZWRlZiBMb2dnZXJJbXA8Qj4gTEw7CnB1YmxpYzoKICAgIEIoKSA6IExvZ2dlckltcDxCPigiQ2xhc3MgQiIgKSB7fQogICAgdm9pZCBkb1NvbWV0aGluZ0luQigpCiAgICB7CiAgICAgICAgTEw6OmxvZygiQiBkb2luZyBzb21ldGhpbmciKTsKICAgIH0KfTsKCmNsYXNzIEMgOiBwdWJsaWMgQiwgcHJpdmF0ZSBMb2dnZXJJbXA8Qz4KewogICAgdHlwZWRlZiBMb2dnZXJJbXA8Qz4gTEw7CnB1YmxpYzoKICAgIEMoKSA6IExvZ2dlckltcDxDPigiQ2xhc3MgQyIgKSB7fQogICAgdm9pZCBkb1NvbWV0aGluZ0luQygpCiAgICB7CiAgICAgICAgTEw6OmxvZygiQyBkb2luZyBzb21ldGhpbmciKTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQiogYiA9IG5ldyBCKCk7CiAgICBDKiBjID0gbmV3IEMoKTsKCiAgICBiLT5kb1NvbWV0aGluZ0luQigpOwoKICAgIGMtPmRvU29tZXRoaW5nSW5DKCk7CiAgICBjLT5kb1NvbWV0aGluZ0luQigpOwoKICAgIHJldHVybiAwOwp9