Function overloading is language feature completely separate from object-oriented design. Just because it tends to exist in languages that have OO features, doesn't make it an OO feature as well. 
The corner stones of OO design are: autonomous classes with limited dependences towards the outside world ("loose coupling"), private encapsulation of data/methods and inheritance/polymorphism. 
Every other feature that doesn't fit in with the above is just some extra fluff. Function overloading and operator overloading are two such fluffy things - there are many OO languages that don't support those 2 features.
As for printf, it uses the icky variable argument feature of the C language. I wouldn't call that function overloading, but rather some old ad hoc crap that was introduced in the 70s just so that C could brag about having variable number of arguments. A feature which is mildy useful, to say the least. It isn't used in any sane, production-quality code.