One of the charters of my team is to try to make the process of learning to program more fun. There are a lot of things we can, should, and will do here. One thing that has stood out for me is how many people have told me they don't understand object orientation at all, and they don't mean that they don't grasp polymorphism. They mean the concept of a class is alien to them.
As a thought exercise, I've run several of my coworkers through some of the "breakthroughs" I think that a beginner makes as they learn to program. One of them is the understanding of basic "cause-and-effect" programming (e.g. if I change the backgroundcolor property, the background color changes). Another is understanding variables. Another is understanding loops and conditionals.
All of these are easy to explain because they have analoges in the physical world. Inheritance doesn't seem to work like that. How do you explain that there's a kind of master entity and that other entities all derive characteristics from it, that you can change these characteristics yet still maintain the relationship between your changed entity and the master? The idea of parents and children doesn't apply (that'd be closer to polymorphism). Amoebic division doesn't apply.
What's a real-world analog to inheritance that I could use to explain it to an eight-year-old?