The selection of the correct procedure to execute is made by examining the arguments used with the message, here interpreting arguments broadly to include the receiver for the message. The term we use to describe the type of all the arguments, including the receiver, is the type signature of the function.
Some languages, such as C++, even allow functions in the same scope to have the same name, as long as their type signatures are different. We see this, for example, in the stream output facility of C++. There are many different overloaded versions of the stream output operator, one for each different argument type.