Don't forget that in the C++ object models, objects are composed of subobjects, which include base subobjects and member subobjects. An abstract class, or more generally an "interface" as you might call it, may not itself be a complete object, but it may well be the subobject of a "more complete" object. And pointers can point to arbitrary objects, including subobjects.
Schematically:
+-- class Der --------------------------------------+
| +---------+ +---------+ +----------+ +---------+ |
| |*********| |*********| |**********| |*********| |
| +- int x -+ +- Base1 -+ +- bool b -+ +- Base2 -+ |
+---------------------------------------------------+
^ ^ ^
| | |
| +-- &a.x +-- static_cast<Base1*>(&x)
&a;
Here we used:
struct Base1 { virtual void f() = 0; };
struct Base2 {};
struct Der : Base2, Base1 { int x; bool b; void f() override {} };
Der a;
The entire purpose of the virtual function dispatch mechanism is that you can call a (virtual) member function on an object that may not be a most-derived, but we will look up at runtime whether we are a subobject of a more-derived object, and we will use that object's class's implementation of the function.