Your perception of this is partially true. This pointer refers to the address of the object which of course is part of a class. To be more formal this is a pointer to the vtable of that class. But in the case you inherit from multiple classes. So what should this point to?
Say you have this:
class concrete : public InterfaceA, public InterfaceB
A concrete object, that inherits from both interfaceA and interfaceB must be able to act as if it was bot interfaceA and interfaceB (that's the point of the public: when you inherit). So there should be a "this- adjustment" so that this can be done.
Normally, in case of multiple inheritance, a base class is selected (say for example interfacea). In that case,

Pretty much every compiler has a "convention" to produce code. In order to call funa for example, the compiler's produced assembly is something like:
call *(*objA+0)
Where the +0 part is the offset of the function inside the vtable.
Compiler needs to know this method's (funa) offset at compile time.
Now what happen if you want to call funb? Based on what we 've said, funb needs to be at offset 0 of an interfaceB object. So there is thunk adjustor to adjust this so that it points to interfaceB's vtable, so that funB can properly be called, again with:
call *(*objB+0)
If you declare something like this:
concrete *ac = new concrete();
interfaceB *ifb = ac;
what do you expect? concrete now plays the role of interfaceB:
If I remember correctly, you can print ifb and ac (they are pointers), and verify that they point to different addresses, but if you check them for equality:
ifb == ac;
You should be getting true, cause they are adjusted in order to depict that they are the same dynamically generated object.
