If Inheritance is so bad, why does everyone use it?
Scope of Use and Perception
- Several commenters say they rarely use inheritance directly today, especially in modern C++, Go, Rust, JS/TS, and Python codebases.
- Others report large, legacy, or Java-heavy systems where inheritance is still pervasive, especially due to historical patterns and teaching.
- Some see “inheritance is bad” as overreaction; others see it as still overused and misunderstood.
Where Inheritance Works Well (According to Thread)
- GUI frameworks and native UI toolkits: widget hierarchies, event handling, and “structural control flow” often model cleanly as shallow class trees.
- Game engines and graphics internals: sometimes use inheritance for engine-side primitives, but gameplay logic tends to migrate to components/ECS.
- Libraries/frameworks: abstract base classes providing partial implementations, plugin bases, filters, and test doubles are widely regarded as good fits.
- Ontological / “is‑a” cases: small, stable hierarchies (e.g., expression trees, maps with abstract base classes) can reduce duplication.
Main Critiques of Inheritance
- Deep or wide hierarchies are hard to reason about, debug, and evolve; changing base classes can break many subclasses (“brittle base class”).
- It often conflates interface and implementation, making refactors and behavioral changes risky.
- Real domains rarely form clean trees; multiple orthogonal concerns (e.g., “ageable”, “monster”, “on fire”) fit composition better.
- In performance-sensitive code (e.g., games), vtables and pointer-chasing can harm cache locality.
Composition, Traits, and Interfaces
- Many advocate “prefer composition over inheritance” rather than “never use inheritance.”
- Alternatives mentioned: interfaces/protocols, traits, mixins, delegation, typeclasses, concepts, multimethods, higher‑order functions, ECS/components.
- Several languages (Go, Rust, Kotlin, Swift, Scala) are cited as steering developers toward these tools and away from implementation inheritance.
Teaching, Culture, and History
- 1990s–2000s OOP hype, GUI frameworks, and Java curricula normalized deep hierarchies and “cars/animals” examples.
- Some educators now explicitly warn students that inheritance is often a poor default and emphasize functions, data shapes, and composition first.
- A recurring claim: many pathologies blamed on OOP/inheritance are sociological (big-org Java culture, over-architecting, design-pattern fashion) as much as technical.
Related Analogies
- CSS cascade/inheritance is compared to class inheritance: powerful but hard to scale; utility-class and BEM styles are framed as “composition over inheritance” in CSS.