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.