Copy constructor is conceptually incompatible with polymorphism. While it can be implemented, it leads to nonsensical situations:
A * a = new A(B);
This makes sense only if A and B are of exactly same type.
Usual solution to this is cloning, which is not without its problems:
A * a = b.clone();
Here, b creates a copy of same type, that will be known as a. The crucial part is that transfers creation of new instance from caller to instance. This solves the problem having to match the types.
clone() is virtual function, implemented by every inherited type. There are likely to be issues with concrete types and inherited clone might need to be called in some way or another.
Copy constructor can then be used to simplify the above process (we now know that A and B are of same type):
Base * Foo::clone() { Base * copy = new Foo(*this); // copy constructor, we know that 'this' is Foo return copy;};