Composition means one object holds another and asks it to do work. Inheritance means one class is a specialised kind of another and receives its members automatically. A car has an engine; an electric car is a car.
Three differences bite in practice. Inheritance is fixed when the code is written, while a composed part can be swapped at runtime. A subclass can see protected members, while a holder sees only the public surface. A subclass inherits the whole parent interface, wanted or not.
Both reuse code, but only inheritance also declares substitutability. That promise is what lets a subclass be passed where the parent is expected, and it is the part you cannot take back later. If all you want is reuse, composition asks for less and gives back more room to change.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓