This gets worse when you work on big projects. You can easily lose track of what each part of your code is responsible for and debugging becomes hell.
I honestly don't see why I should ever bother worrying about whether or not a particular set of functions can "see" each other, or whether or not I can make two functions with the same name.
You have to study OOP to understand. And by studying I mean really studying the paradigm, independent of a language. Looking at a language grammar and all its possible sentences you cannot see why something is useful or not, but when you study the concept behind it you start seeing the power each sentence has.
That is your job as programmer to tell. You are the one that decided if overloading a function is necessary and what they will execute. Who said that different implementations of a function should be completely different?
Why would I ever want more code obfuscation like that -- two functions with identical names that can do two completely different operations? Why on earth would I ever want such a thing?
I don't know any good books to teach Object Orientation (maybe someone can suggest one). I had to take a course on that at the university and I thank my teacher for teaching us the paradigm instead of Java or C++.
Note: I am not saying you should use OO on your projects. I am just saying that you should learn it to understand how it works. Knowledge is power in my opinion