Each concrete Subject derived class "hasa" pointer to one or more Extension classes that it is meaningful for it to support. It also has a "Extension* getExtension(char* type)" method that accepts the identifier for the desired Extension class, and returns a pointer to that class if it is supported, or NULL if it is not.
Finally, to access a Subject object's Extension object, the client: calls the getExtension method with the "type" of the desired Extension class, performs RTTI to test the type of the returned object, and if the result is not-NULL then the desired method is called on the returned object.
Normally, a class is extended by subclassing and adding methods to the derived class. Extension Object provides extensibility without the subclassing.
Some of the trade-offs associated with the pattern are: clients of the extended object become more complex, and there is a temptation to lean on this technique to rationalize reactive fixing rather than commit oneself to proactive design.