class Top { }; class Middle : public Top { }; template< typename T > class Tpl : public Top { }; class Visitor { ~Visitor() {} virtual void visit( const Top& v ); virtual void visit( const Middle& v ); /* won't compile, so you cannot visit this class directly. sucks, eh? template< typename T > virtual void visit( const Tpl< T >& v ); */ }; int main() { return 0; }