#include <iostream>
using namespace std;

#define SUPER_BASE(name) \
	typedef name ThisClass; \
	typedef name Inherited;
	
#define SUPER(name) \
	typedef ThisClass Inherited; \
	typedef name ThisClass;
	
struct VeryBase
{
	SUPER_BASE(VeryBase);
};

struct Derived : public VeryBase
{
	SUPER(Derived);
};

struct MoreDerived : public Derived
{
	SUPER(MoreDerived);
};

void f(VeryBase) { cout << "VeryBase\n"; }
void f(Derived) { cout << "Derived\n"; }
void f(MoreDerived) { cout << "MoreDerived\n"; }

int main() {
	
	f(MoreDerived::ThisClass());
	f(MoreDerived::Inherited());
	
	f(Derived::ThisClass());
	f(Derived::Inherited());
	
	return 0;
}