fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <typename Derived> struct base
  6. {
  7. void interface()
  8. {
  9. static_cast<Derived*>(this)->implementation();
  10. }
  11. void implementation()
  12. {
  13. cout << "Default\n";
  14. }
  15. };
  16.  
  17. struct overrider : base<overrider>
  18. {
  19. void implementation()
  20. {
  21. cout << "Overridden\n";
  22. }
  23. };
  24.  
  25. struct nonoverrider : base<nonoverrider>
  26. {
  27. };
  28.  
  29. template <typename twicederived> struct derived : base<twicederived>
  30. {
  31. void implementation()
  32. {
  33. cout << "Derived Base\n";
  34. }
  35. };
  36.  
  37. struct twicederivednonoverrider : derived<twicederivednonoverrider>
  38. {
  39. };
  40.  
  41. struct twicederivedoverrider : derived<twicederivedoverrider>
  42. {
  43. void implementation()
  44. {
  45. cout << "Derived overridden\n";
  46. }
  47. };
  48.  
  49. int main()
  50. {
  51. overrider overrider;
  52. nonoverrider nonoverrider;
  53. twicederivednonoverrider twicederivednonoverrider;
  54. twicederivedoverrider twicederivedoverrider;
  55.  
  56. overrider.interface();
  57. nonoverrider.interface();
  58. twicederivednonoverrider.interface();
  59. twicederivedoverrider.interface();
  60. }
  61.  
Success #stdin #stdout 0s 2896KB
stdin
Standard input is empty
stdout
Overridden
Default
Derived Base
Derived overridden