class A { public: virtual A* f() { return this;}; A* get_this() { return this;}; }; template class C : public A { public: virtual B f() { return (B)A::get_this();}; }; class D : public A { int x; public: }; template<> class C : public A { public: virtual D* C::f() { return (D*)0;}; }; int main( ) { C CA; C DA; return 0; }