As defined in the famous book "Design Patterns -
Elements of Reusable Object-Oriented Software," Delegation is "a way of making composition as powerful for reuse as inheritance.
In delegation, two objects are involved in handling a request: a receiving
object delegates operations to its delegate. This is analogous to subclasses
deferring requests to parent classes. But with inheritance, an inherited
operation can always refer to the receiving object through the member variable
in C++ and self in Smalltalk. To achieve the same effect with delegation, the
receiver passes itself to the delegate to let the delegated operation refer to
the receiver."
In short, delegation can be viewed as a relationship between
objects where one object forwards (or delegate) certain method calls to another
object.