Just like all but one members of a C struct cannot have the same address as the encompassing object, all but one non-empty base class subobjects cannot have the same address as the complete object; a polymorphic base class (one with virtual functions) is not empty by definition.
The polymorphic base subobject that has the same address as the derived object is called the primary base. The derived object shares the base of the vtable layout and the vptr with the primary base: the implicit this
parameter is not changed.
Note: The concept of primary base is a C++ implementation domain concept (like vtable, vptr...), not a C++ language concept (like base class, virtual function...). So, obviously, it is not described in the C++ standard.
When a virtual function is called dynamically, via the virtual call mechanism, on a object of an unknown dynamic type, the this
implicit argument must be adjusted to the correct value, which is a different value of the non primary bases. The intermediary that does that is called a thunk. In this case, the thunk can do a jump and not a function call, to the correct function: the extra work occurs on function entry, and nothing is needed on function exit.
Another type of adjustment occur when a covariant return type is used and the derived to base relation of the covariant return is not a derived to primary base relation. Obviously this kind of thunk doesn't do a jump, it does a function call, as the adjustment for covariance occurs on function exit.