Todas buenas respuestas.
Solo agregaría "minimizar la estructura de datos". Esto podría ser incluso más fácil en C, porque si C ++ es "C con clases", OOP está tratando de alentarlo a tomar cada sustantivo / verbo en su cabeza y convertirlo en una clase / método. Eso puede ser un desperdicio.
Por ejemplo, suponga que tiene una matriz de lecturas de temperatura en puntos en el tiempo y desea mostrarlas como un gráfico de líneas en Windows. Windows tiene un mensaje PAINT, y cuando lo recibe, puede recorrer la matriz haciendo funciones LineTo, escalando los datos a medida que avanza para convertirlos a coordenadas de píxeles.
Lo que he visto demasiadas veces es que, dado que el gráfico consta de puntos y líneas, la gente construirá una estructura de datos que consta de objetos puntuales y objetos de línea, cada uno capaz de DrawMyself, y luego lo hará persistente, en la teoría de que eso es de alguna manera "más eficiente", o que quizás, solo tal vez, tengan que poder pasar el mouse sobre partes del gráfico y mostrar los datos numéricamente, por lo que crean métodos en los objetos para lidiar con eso, y eso, por supuesto, implica la creación y eliminación de aún más objetos.
Así que terminas con una gran cantidad de código que es muy legible y simplemente pasa el 90% de su tiempo administrando objetos.
Todo esto se hace en nombre de "buenas prácticas de programación" y "eficiencia".
Al menos en C, la forma simple y eficiente será más obvia y la tentación de construir pirámides será menos fuerte.