Ok, it looks like you're intuiting the concept of polymorphism.
Let's start with a little semantic bridging. I use the term "encapsulate" to mean place a boundary around some specific functionality and expose it to the rest of the application domain via a consistent interface. I'm not sure how you can, given this definition, encapsulate relationships of any kind. I encapsulate functionality, not the means by which different "capsules" of functionality communicate with one another.
Polymorphism, then. Basically, polymorphism will have a base class that is fully abstract (an "interface"), and subclasses that "implement the interface". One then may use the base class as a type, and get "polymorphic" behavior by instantiating that type as any of a number of subclasses.
An example I'm fond of using in class is this. I want to make a bunch of animals. Animals all do certain things, have certain attributes in common, although they do them differently. Let's take two examples, moving and biting.
Class: Animal <<interface>>
Move
Bite
Class: Flea
Implements Animal
Class: TRex
Implements Animal
Note in the above that move and bite are abstract in Animal, and concrete in the implementing classes.
So, as you can see, fleas move differently from trexes, and obviously bite with noticeably different effect. You can write functions that take a pointer to an animal object as an argument and pass it either a flea instance or a trex instance as desired. For example, you could have an Encounter procedure that will evaluate the attack range of the animal instance passed, and call a related Attack procedure if within range, using the specific move and bite methods of the instance passed.
If you play any video games, you might ask yourself how polymorphism is being used in those games. You'll begin to get ideas.
Finally, this is a concise little explanation of polymorphism and encapsulation:
Feel free to post back, of course.
HTH
Bob