Inheritance?
makecheck: 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. :)