Herencia y composición le permiten crear nuevos tipos desde tipos existentes y ambos incluyen subobjetos de tipos existentes dentro del nuevo tipo. Sin embargo, normalmente, utilizara la composición para reutilizar tipos existentes como parte de la capa de implementación de un nuevo tipo y la herencia cuando desea forzar al nuevo tipo a ser del mismo tipo que la clase base (la equivalencia de tipos garantiza la equivalencia de la interfaz). Como las clases derivadas tienen el interfaz de la clase base, esta puede ser convertidas a la base, lo cual es crítico para el poliformismo como verá 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 deseara rediseñar su jerarquía de clases antes de permitir a otros programadores dependan de ella. Su objetivo es crear una jerarquía en que cada clase tenga un uso especifico y sin ser demasiado grande (esforzándose más en la funcionalidad que en la dificultad de la reutilización...), ni pequeña, (no se podrá usar por si mismo o sin añadir funcionalidad).