@inthehands chapter one of Head First Design Patterns is about this. They build out an example using inheritance to share behaviour, then go to using composition instead, arguing why composition is usually better
IMO, it's the most approachable and best programming design book out there