#include <iostream>

using namespace std;

template <typename Derived> struct base
{
  void interface()
  {
    static_cast<Derived*>(this)->implementation();
  }
  void implementation()
  {
    cout << "Default\n";
  }
};
 
struct overrider : base<overrider>
{
  void implementation()
  {
    cout << "Overridden\n";
  }
};

struct nonoverrider : base<nonoverrider>
{
};

template <typename twicederived> struct derived : base<twicederived> 
{
  void implementation()
  {
    cout << "Derived Base\n";
  }
};

struct twicederivednonoverrider : derived<twicederivednonoverrider>
{
};

struct twicederivedoverrider : derived<twicederivedoverrider>
{
  void implementation()
  {
    cout << "Derived overridden\n";
  }
};

int main()
{
  overrider overrider;
  nonoverrider nonoverrider;
  twicederivednonoverrider twicederivednonoverrider;
  twicederivedoverrider twicederivedoverrider;

  overrider.interface();
  nonoverrider.interface();
  twicederivednonoverrider.interface();
  twicederivedoverrider.interface();
}
