error: redefinition of class

Your main.cpp includes files which include shape.cpp, which ends up being included multiple times. You can avoid this by wrapping your included files with a check for a definition:

#ifndef SHAPE_CPP
#define SHAPE_CPP

//file contents

#endif

You should structure your code between .h (headers) and .cpp files (implementation).

You should include header files: .h Never include .cpp files. (Unless you know what you do, and that would be in really rare cases).

Otherwise you're ending compiling several times your class, and you get the error your compiler is telling you: 'redefinition of class...'

An additional protection against this error are Include Guards, or Header Guards.

Most compilers support something of the like #pragma once that you write at the top of .h files to ensure it is compiled only once.

If the pragma is not available for your compiler, then there is the traditionnal Include/Header guard system:

#ifndef MYHEADEFILE_H
#define MYHEADEFILE_H

// content of the header file

#endif