Polymorphism via callbacks, e.g. the standard library's qsort
function. All it needs is a way to compare two elements, and it can sort an array of them.
You can be much more sophisticated than this by using sets of functions (vtables) to represent the pertinent properties of a type so that a generic routine can process it usefully. For example, the read, write, etc. calls on an open file, or network port.