There are other methods to register class somewhere similar to virtual tables: static constructors (to do something with type once), interface with static members (whole Hashing can be implemented there), AOP and reflection (namely
CreateDelegate
method after you register all types). I would also pack different children in kind of modules with partial classes for each functionality (like hashing) and nesting. Then creating a new child is a copy/paste, no need to go elsewhere.