Вы должны структурировать свой код между .h (заголовками) и .cpp-файлами (реализация).
Вы должны включить файлы заголовков: .h
Никогда не включать файлы .cpp
. (Если вы не знаете, что делаете, и это было бы в очень редких случаях).
В противном случае вы заканчиваете компиляцию несколько раз своего класса, и вы получаете сообщение об ошибке, которое ваш компилятор говорит вам: «переопределение класс ...
В файл main.cpp входят файлы, которые включают shape.cpp, который в конечном итоге включается несколько раз. Вы можете избежать этого, обернув ваши включенные файлы проверкой на определение:
#ifndef SHAPE_CPP
#define SHAPE_CPP
//file contents
#endif