Well, the biggest problem is that it confuses people, leading to difficult to find bugs (you think you're referring to one variable when in fact you're referring to another).
In real development, though, you should just avoid it. For instance, if you're following the practice of making all member variables private, then they're not visible to the subclass, so the problem never arises.
It's also true in "real development" that 'protected' access is a very powerful
and helpful tool to write clean and readable code. So making everything
private doesn't always work out the best. Lots of "sets" and "gets" can really
cloud the code. I have found that careful choice of variable names is a good
answer. And as you say, never-never-never allow hiding to happen.