class Base { public: virtual int GetClassID(void) = 0; };
template <class T> class Middle : public Base { public: int GetClassID(void) { static int x; return reinterpret_cast<int>(&x); }};
class SubA : public Middle<SubA> {};
class SubB : public Middle<SubB> {};
class SubC : public Middle<SubC> {};