I tripped over this as an undergraduate. On the surface, overloading looks like it has the same purpose and function as (virtual) method dispatch, but the difference between static and dynamic typing is subtle enough that they don't interact the way one might expect them to.