An object is polymorphic when its specific type may vary.
The types a specific value may take, is called class.

It is trivial to copy an object if its type is known:

int x;
int y = x;
Here x is not polymorphic, so y is declared of same type (int) as x.
But if the specific type of x were unknown, then y could not be declared of any specific type.

The task: let a polymorphic object contain an instance of some specific type S derived from a type T.
The type T is known.
The type S is possibly unknown until run time.
The objective is to create an exact copy of such polymorphic object (not to create a reference, nor a pointer to).
Let further the type T have a method overridden by S.
This method is to be called on the copy to demonstrate that the specific type of the copy is indeed S.

#lang racket/base
 
(define (copy-prefab-struct str)
  (apply make-prefab-struct (vector->list (struct->vector str))))
 
(struct point (x y) #:prefab)
(struct point/color point (color) #:prefab)
 
 
(let* ([original (point 0 0)]
       [copied (copy-prefab-struct original)])
  (displayln copied)
  (displayln (eq? original copied)))
 
(let* ([original (point/color 0 0 'black)]
       [copied (copy-prefab-struct original)])
  (displayln copied)
  (displayln (eq? original copied)))