Herança x composição: quando cada uma
Pergunta
Qual a diferença entre reusar código por herança e por composição, e por que o conselho comum é 'prefira composição'?
Resposta esperada
Herança expressa 'é um' e acopla a subclasse à implementação da superclasse: mudar a base pode quebrar filhos (fragile base class), e a hierarquia é fixada em tempo de compilação. Composição expressa 'tem um' — o objeto delega para outros objetos que recebe, geralmente por uma interface, então dá pra trocar comportamento em runtime e testar cada peça isolada. 'Prefira composição' porque herança profunda vira uma teia rígida onde reuso força você a herdar coisas que não quer. Herança ainda é boa quando há uma relação de subtipo genuína e estável e você quer polimorfismo — mas é a exceção, não o reflexo.
Por que perguntam isso
Pergunta que separa quem decorou 'os 4 pilares' de quem já manteve uma hierarquia grande. Bom sinal: citar 'fragile base class' ou dar um exemplo de herança que deu errado.