Если под «повторным использованием» вы просто подразумеваете, что код не нужно повторять в каждом модуле кода, тогда да, заголовочный файл в C выполняет эту задачу, потому что он допускает объявления для функций и переменных, определенных с внешнее связывание в одном модуле кода для использования в другом модуле кода без необходимости повторного ввода всех этих объявлений и / или попытки поместить каждое определение каждой функции, которая обычно является частью библиотеки, в каждый модуль кода. Таким образом предотвращается дублирование кода.
Объектно-ориентированное программирование посредством использования наследования и полиморфизма в таких языках, как C ++ и Java, имеет аналогичный эффект ... вы определяете интерфейс и / или базовый класс один раз, а затем вы можете «включить» это код через наследование в другом классе. Кроме того, виртуальные методы наряду с полиморфизмом позволяют вам писать функции, которые принимают один тип базового класса в качестве аргумента, и в то же время вызывают код, который фактически определен в производном типе класса. По сути, это означает, что вы можете вызвать новый код (т. Е. Ваш производный класс), в старый код (т. Е. Функцию, которая приняла тип базового класса). Например, как разработчик библиотеки, вы можете определить набор типов / интерфейсов базового класса, и пользователь может получить эти базовые классы, но при этом эффективно использовать их в тех же функциях, которые были включены в библиотеку, которая принимает аргументы типа базового класса. Таким образом, вы не обязаны дублировать эти функции ... они все еще могут использоваться вашими "новыми" производными классами.