The problem came from the Object itselft.It can divided into two aspect:
1.Everything is an Object: that's not true,lots of so called object is not object ,it's just a Wrapper.You dont know what it is ,but you just need one to let things go on. Sadly ,they are theoretically equall to the "real" object ,that's confusing and mislead.
2.Even the REAL OBJECT is also very hard to make it right.Object Oriented Programming suppose developer are philosopher or "God" ,they know everything well,they can do the thing well at one hit.Sadly ,most of us aren't.In real world ,there are not such easy object ,cat ,dog ,shape etc. Most of the time ,we dont know the OBJECT we handled very well.It's about concept ,not only about object.Human learn the concept gradually,that's mean we need refactor our Object iteratorly.Sadly , lots of project or product due to the time issue,pressure etc, they are developed in the wrong way ,and are not gradually go well.
A nother drawback is inheritance was build in a shaken base ,and inheritance is high-coupled .Abuse use of that can make the code become a totally crap! It's hard to clean,probably the only way to rescue it is to rewrite it .A painful fact is that most inheritance use by novoice ,they want to practice the "high-order technic" to PRACTICE,this just lead to a disaster .