Краткий ответ:
Абстрактные классы - это концепция объектно-ориентированного программирования. Заголовочные файлы являются необходимостью из-за способа, которым построен язык C. Это никак нельзя сравнить
Длинный ответ
Чтобы понять заголовочный файл и необходимость в заголовочных файлах, вы должны понимать понятия «объявление» и «определение». В C и C ++ объявление означает, что вы объявляете, что где-то что-то существует, например, функция.
void Test(int i);
Теперь мы объявили, что где-то в программе существует функция Test, которая принимает один параметр int. Когда у вас есть определение, вы определяете, что это такое:
void Test(int i)
{
...
}
Здесь мы определили, что такое функция void Test (int).
Глобальные переменные объявляются с использованием ключевого слова extern
extern int i;
Они определены без ключевого слова extern
int i;
Когда вы компилируете программу на C, вы компилируете каждый исходный файл (файл .c) в файл .obj. Определения будут скомпилированы в файл .obj как фактический код. Когда все они скомпилированы, они связаны с конечным исполняемым файлом. Следовательно, функция должна быть определена только в одном файле .c, в противном случае одна и та же функция будет несколько раз выполняться в исполняемом файле. Это не очень важно, если определения функций идентичны. Более проблематично, если глобальная переменная дважды связана с одним и тем же исполняемым файлом. Это оставит половину кода для использования одного экземпляра, а другую половину кода для использования другого экземпляра.
Но функции, определенные в одном файле .c, не могут видеть функции, определенные в других файлах .c. Поэтому, если из файла file1.c вам нужен доступ к функции Test (int), определенной в file2.c, вам необходимо иметь объявление Test (int), присутствующее при компиляции file1.c. Когда file1.c скомпилирован в file1.obj, результирующий файл .obj будет содержать информацию о том, что ему нужно где-то определить Test (int). Когда программа связана, компоновщик идентифицирует, что file2.obj содержит функцию, от которой зависит file1.obj.
Если нет файла .obj, содержащего определение для этой функции, вы получите ошибку компоновщика, а не ошибку компилятора (ошибки компоновщика значительно сложнее найти и исправить ошибки компилятора, потому что вы не получите имя файла и номер строки для полученного файл)
Таким образом, вы используете файл заголовка для хранения объявлений для определений, хранящихся в соответствующем исходном файле.