Bug #1:
You are allowed to call the constructor of a member variable or base class only from the initializer list of your constructor.
Rectangle(int a, int b)
: Shape(a, b)
{
}
Bug #2:
"no matching function for call to Shape::Shape()"
If you don't explicitly call the constructor of Shape from your derived class then the compiler automatically calls the default (parameterless) constructor of the base class. The problem with this is that your Shape class doesn't have a default constructor because the compiler auto-generates a default constructor only if you don't provide any other constructors. If you define your own constructors then the class will have a default constructor only if you write one for it.