#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBTVVBFUl9CQVNFKG5hbWUpIFwKCXR5cGVkZWYgbmFtZSBUaGlzQ2xhc3M7IFwKCXR5cGVkZWYgbmFtZSBJbmhlcml0ZWQ7CgkKI2RlZmluZSBTVVBFUihuYW1lKSBcCgl0eXBlZGVmIFRoaXNDbGFzcyBJbmhlcml0ZWQ7IFwKCXR5cGVkZWYgbmFtZSBUaGlzQ2xhc3M7CgkKc3RydWN0IFZlcnlCYXNlCnsKCVNVUEVSX0JBU0UoVmVyeUJhc2UpOwp9OwoKc3RydWN0IERlcml2ZWQgOiBwdWJsaWMgVmVyeUJhc2UKewoJU1VQRVIoRGVyaXZlZCk7Cn07CgpzdHJ1Y3QgTW9yZURlcml2ZWQgOiBwdWJsaWMgRGVyaXZlZAp7CglTVVBFUihNb3JlRGVyaXZlZCk7Cn07Cgp2b2lkIGYoVmVyeUJhc2UpIHsgY291dCA8PCAiVmVyeUJhc2VcbiI7IH0Kdm9pZCBmKERlcml2ZWQpIHsgY291dCA8PCAiRGVyaXZlZFxuIjsgfQp2b2lkIGYoTW9yZURlcml2ZWQpIHsgY291dCA8PCAiTW9yZURlcml2ZWRcbiI7IH0KCmludCBtYWluKCkgewoJCglmKE1vcmVEZXJpdmVkOjpUaGlzQ2xhc3MoKSk7CglmKE1vcmVEZXJpdmVkOjpJbmhlcml0ZWQoKSk7CgkKCWYoRGVyaXZlZDo6VGhpc0NsYXNzKCkpOwoJZihEZXJpdmVkOjpJbmhlcml0ZWQoKSk7CgkKCXJldHVybiAwOwp9