Firstly, a number of different implementations of a function can be supplied, which have the same name but are differentiated by the number and types of their arguments. This is a similar effect to the way that some functional programming languages pattern match on their arguments.
Secondly, it is convenient to define meanings for standard operators, such as addition, when they are applied to user defined types.