Tanto la herencia como la composición le permiten crear un nuevo tipo a partir de tipos existentes, y ambas alojan subobjetos de los tipos existentes dentro del nuevo tipo. Sin embargo, normalmente utilizará la composición para reutilizar tipos existentes como parte de la implementación subyacente del nuevo tipo, y la herencia cuando quiera obligar al nuevo tipo a ser del mismo tipo que la clase base (la equivalencia de tipos garantiza la equivalencia de interfaces). Como la clase derivada tiene la interfaz de la clase base, se le puede hacer upcast a la base, lo cual es fundamental para el polimorfismo, como verá en el Capítulo 15.
Aunque la reutilización de código a través de la composición y la herencia es muy útil para el desarrollo rápido de proyectos, generalmente querrá rediseñar su jerarquía de clases antes de permitir que otros programadores dependan de ella. Su objetivo es una jerarquía en la que cada clase tenga un uso específico y no sea ni demasiado grande (que abarque tanta funcionalidad que resulte difícil de reutilizar) ni irritantemente pequeña (que no se pueda usar por sí sola o sin añadirle funcionalidad).