fork download
  1. #include "iostream"
  2.  
  3. class Logger
  4. {
  5. public:
  6. Logger(std::string name) : name_(name) {}
  7. void log(std::string msg) { std::cout << name_ << ": " << msg << std::endl; }
  8. private:
  9. std::string name_;
  10. };
  11.  
  12. template<typename T>
  13. class LoggerImp : public Logger
  14. {
  15. public:
  16. LoggerImp(const std::string& n) : Logger(n) {}
  17. };
  18.  
  19. class B : private LoggerImp<B>
  20. {
  21. typedef LoggerImp<B> LL;
  22. public:
  23. B() : LoggerImp<B>("Class B" ) {}
  24. void doSomethingInB()
  25. {
  26. LL::log("B doing something");
  27. }
  28. };
  29.  
  30. class C : public B, private LoggerImp<C>
  31. {
  32. typedef LoggerImp<C> LL;
  33. public:
  34. C() : LoggerImp<C>("Class C" ) {}
  35. void doSomethingInC()
  36. {
  37. LL::log("C doing something");
  38. }
  39. };
  40.  
  41. int main()
  42. {
  43. B* b = new B();
  44. C* c = new C();
  45.  
  46. b->doSomethingInB();
  47.  
  48. c->doSomethingInC();
  49. c->doSomethingInB();
  50.  
  51. return 0;
  52. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Class B: B doing something
Class C: C doing something
Class B: B doing something