The compiler basically compiles each cpp file individually and then links the output. If you now change one of the includes used in this cpp or the cpp itself, you need to re-compile that cpp (if you do an incremental build).
Let's assume your cpp file foo.cpp includes a header bar.h. bar.h defines a class foobar. If you now change a private variable (an implementation detail) of foobar, you need to recompile foo.cpp. If you make an abstract base class (e.g. Ifoobar in ibar.h), foo.cpp can now include ibar.h. If you now change an implementation detail of bar.h it does not force a recompile of foo.cpp. Assume that this class foobar is used in thousands of files and you saved a lot of compilation time.
Regards Tobias