class D; const int a = sizeof 0, b = sizeof 0; template < int >struct A; template <> struct A <4 > { static int SmiToInt (const D * p1) { return reinterpret_cast < int >(p1); } }; class B { public: static int SmiValue (const D * p1) { return A < a >::SmiToInt (p1); } }; class C { }; class D:C { }; class F:D { public: int value (); }; class G:D { int SizeFromMap (); }; class H:G { public: static int SizeFor (int, int); }; int F::value () { return B::SmiValue (this); } int G::SizeFromMap () { int c, g; { int d; F *e; D *f = *reinterpret_cast < D ** >(reinterpret_cast < char *>(this) + b - 1); e = reinterpret_cast < F * >(f); d = e->value (); c = d; } F * h; D *i = *reinterpret_cast < D ** >(reinterpret_cast < char *>(this) - 1); h = reinterpret_cast < F * >(i); g = h->value (); H::SizeFor (g, c); }