OOP exploits polymorphism in function names. Functions in different object types can have the same name, because the type of the arguments can be used to resolve any ambiguity.
Example: Suppose you want to create a new ADT for sets, and you want the type to include an operation MEMBER. What if some other type (perhaps written by someone else, and included as part of your program) already has an operation called MEMBER? If the language supports polymorphism, the call to MEMBER(s:SET) can be associated with the correct function (the one defined within the SET data type), since it is (presumably) the only function named MEMBER that accepts a variable of type SET as an argument. Polymorphism allows you to invent function names for an ADT without worrying about whether or not that name is already being used by another ADT.