Наверное, в main.cpp включается всё же cyborg.h, а не univ.h.
А так - всё верно. Один и тот же код, содержащийся в univ.h, попадает в компиляцию столько раз, из скольки модулей он прямо или опосредованно (в составе других заголовков) включён.
Именно поэтому две вещи в заголовках ведут к ошибкам при сборке:
1. Заголовочный файл содержит определение функций, методов классов или глобальных переменных. Тогда после сборки модулей, в процессе линковки выяснится, что скомпилировано несколько экземпляров одноимённых вещей. И будет ошибка линковки, поскольку линковщик не умеет разрешать такие ситуации - он не может установить, что это просто один и тот же код.
2. Заголовочный файл не имеет защиты от повторного включения. Обычно такая защита делается как блок
#ifndef FOO_H_
#define FOO_H_
// весь код здесь
#endif
или, в Microsoft-стиле, можно просто #pragma once (но я предпочитаю придерживаться 1го варианта, он переносимый).
Такая защита обеспечивает, что если заголовок включается дважды в одном месте, то код второй раз включён не будет. А если защиты нет, будет ошибка компиляции - повторное определение.
В том, что в код повторно включаются заголовки с объявлениями функций и классов и определениями шаблонов - в этом нет ничего страшного. На объём выходного кода это не влияет. Влияет это только на время компиляции, но для ускорения компиляции есть вспомогательные техники. Прежде всего, это так называемая прекомпиляция заголовков - если используешь Visual Studio, там эта методика широко применяется.