There is no conceptual restriction on ad hoc polymorphism. Overloading occurs when the same name is used to refer to more than one function. The proper function is determined through context. Overloading is syntactic. The proper conversion is determined by context.
Coercion is semantic.
When the arguments are of different types, the integer argument is coerced to type real. Integers are always coerced to type real before the operator is applied. Most common in functional programming languages. Uniformity is achieved by use of type parameters or variables. Executes the same code for arguments of any admissible type.