A subclass inherits methods or fields it doesn't actually use — overriding to no-ops, throwing 'unsupported', or just ignoring the inheritance.
Sharing happens through composition (a delegate object) rather than forced inheritance.
Smellier version
class Animal { fly() {} swim() {} }class Dog extends Animal {fly() { throw new Error('no'); }}
Fresher version
class Dog {// composes a Mover delegate that knows it's a swimmer}
Liskov violations: callers can't trust subclass instances to honor the parent contract; polymorphism becomes a trap.
Replacing inheritance with composition is more verbose at construction sites and removes the syntactic polymorphism inheritance provided; consumers that rely on `instanceof` checks or shared base methods need explicit migration.
Each class has only what it needs; surprises in polymorphic use disappear.
Replacing every inheritance relationship with composition, including ones where the Liskov contract genuinely holds — pays construction-site verbosity for no real fit improvement.