It seems natural to overdo a new tool until you've found its best uses.
But I think the only drug is perfectionism, and it applies to anything reasonably complicated. The cure is brutal honesty. How much will you really be able to reuse in a sophisticated design? (Not much.) How likely is it to change? (Very likely.) Will an unanticipated new feature completely destroy your formerly-perfect object design? (Often, yes.)
One of the original thoughts behind inheritance was to manage complexity. But since code is read much more than it is written, I think of my eyes and not my fingers. Sure, I may have saved some time writing the code, and even had fun coming up with its unique design. But the next 40 or 50 times I have to go back and understand the code, and read 4 or 5 other files just to figure out what a function does, I see the error of my ways.
That doesn't mean I avoid inheritance, but I strictly limit it to things where it has immediate and obvious value. I may have one parent class, and the class isn't very big. It's also not something I'm likely to share in a public header; I'll inherit from it myself, and not ask others to do the same, which avoids a whole category of hurt. :)