A fascinating Cornell University study a few years ago found that people who are incompetent tend to dramatically overestimate their own competence, and people who truly are quite competent tend to underestimate their own performance.
This makes a certain sense: After all, if you're incompetent, you're inherently more likely not to be able to competently self-assess (or assess the people you're comparing yourself to). As the researchers write, "Not only do they reach erroneous conclusions and make unfortunate choices, but their incompetence robs them of the ability to realize it."
And if you're competent, you tend to assume others are performing at a similar level to you (since you can't imagine why they wouldn't be), and plus, part of competence is being aware of your own shortcomings.
This study has interesting implications for managers. For one, it reinforces the idea that you must be explicit with employees who aren't meeting your expectations -- particularly about the severity of the problem and what the possible consequences could be. All too often, managers assume that employees surely must know they are in danger of being fired, given all the warnings and serious talks being directed their way, and so they don't bother to spell it out ... and then the employee is shocked when he or she gets fired. The manager is baffled by this surprise, since the person should have seen it coming.
I suspect that many low performers are used to hearing negative feedback from bosses and thus don't process it as a danger sign. So managers should commit to saying the words, "I must warn you that your job is in jeopardy if you don't improve." Don't assume the person should know. If they're as incompetent as you worry they are, there's a good chance they have no idea.