Inheritance is often used as an enabler for polymorphism in languages that don't support it in any other way.
Somehow, it leaked out and convinced everyone that it is a good thing on its own.
Somehow, it leaked out and convinced everyone that it is a good thing on its own.
- interface/API based -- this is supported in modern languages via interfaces, traits, etc.
- implementation/code based -- modern languages tend to only support single inheritance; they tend to also support default method implementations on the interfaces/traits
Those are actually mechanisms for achieving polymorphism.
Inheritence inherently (heh) consists of "inheriting" parent class' internals and having ability to extend them. It is basically composition, polymorphism and monkeypatching in a trench coat.
Not even gonna comment on "message passing".