The answer is copy semantics.
When you pass an object by value in C++, e.g.
printArea(Shape shape) a copy is made of the object you pass. And if you pass a derived class to this function, all that’s copied is the base class
Shape. If you think about it, there’s no way the compiler could do anything else.
Shape shapeCopy = circle;
shapeCopy was declared as a
Shape, not a
Circle, so all the compiler can do is construct a copy of the
Shape part of the object.