Можно сказать, что один файл .cpp и все включенные в него заголовки составляют одну единицу перевода. Как видно из названия, одна единица перевода компилируется самостоятельно. Результат, часто называемый file.o или file.obj для каждого модуля перевода, затем связывается вместе компоновщиком, исправляя еще не разрешенные ссылки. Так что в вашем случае у вас есть
Translation Unit 1 = run.cpp: myclass.h ...
Translation Unit 2 = myclass.cpp: myclass.h ...
Ваше определение класса будет отображаться в обеих единицах перевода. Но это нормально. Это разрешено, если оба класса одинаково определены. Но нельзя использовать одну и ту же функцию в двух единицах перевода, если она не встроенная. Не встроенные функции могут быть определены только один раз, в одной единице перевода. Затем компоновщик берет результат каждого модуля перевода и связывает их вместе с исполняемым файлом:
Executable = mystuff: run.o myclass.o ...