I'm not sure the questions were very clear to me (not necessarily your fault, no worries - I'm tired and other things), but I'll give it a shot.
1.
What exactly is the problem ?
Also, can you modify any of the interfaces of the "given" classes (the other 3, I presume) ?
Wouldn't evey subclass have its own get/set methods for handling the name ? So, if the object you're calling setName() for is a Link, the appropriate method from the Link class will be invoked. You don't have to do anything special for this.
Are you asking how to create a constructor for the Link class, that does take a reference as an argument ? Or what exactly ? Sorry, I don't get it.
2.
Polymorphism allows you to invoke the right type of method for the appropriate type of object - you don't have to do anything to get that functionality.
For instance, assume you wanna call setName() for some DiskItem, which is actually a Link. Then Link.setName() will be called, because the object actually belongs to the Link class.
You can also define virtual methods in the DiskItem class.
From what I've seen, a common approach is to define the get/setName methods in the DiskItem class as abstract methods - e.g., String getName (DiskItem x) = 0; (or return false, or some error code).
This will force people to define them in the subclasses, for the appropriate type of objects.
I really don't know if any of this was any help, if you can be more specific, it would help.
Good luck anyway !
edit: oh, I forgot to mention one thing: if you have a DiskItem object, there are methods that check if you can downcast it to a subclass type (IF it is, indeed, of that class type). I don't remember the class name and the methods, though. But this may be what you want - of course, you can always downcast it yourself if you know that the DiskItem is in fact a Link.
Bookmarks