This has the effect that the data member optr of the LHS interface object will point to the RHS interface object.
The storage needed for an interface object is two words: the pointer to the class object, optr, and the pointer to S_C_Interface<C>'s virtual function table.
Conceptually, the type of optr should be pointer to any object instead of pointer to void.
The value of p's optr is passed as the first argument so that C::g gets a pointer to the right object passed for its implicit first parameter called this.
When assigning a signature pointer to another signature pointer of the same type, we simply copy the two data members optr and sptr.
The value passed for the first argument, this, is the data member optr from the signature pointer.
In the thunk implementation described in Granston and Russo [1991], copying of signature table entries is avoided by having the optr of the LHS signature pointer point to the RHS signature pointer instead of pointing to the object.
The memory required for interface objects in the preprocessor implementation of signatures is two words, one for the pointer to the object (optr) and one for the pointer to the interface object's virtual function table.