There are two benefits to manipulating objects solely in terms of the interface
defined by abstract classes:
1. Clients remain unaware of the specific types of objects they use, as long
as the objects adhere to the interface that clients expect.
2. Clients remain unaware of the classes that implement these objects. Clients
only know about the abstract class(es) defining the interface.
You write a program that uses a library. Compile and link. When you run the program, it dynamically links to the library file.
The author of the library decides to rewrite everything (except the interface). A new library file is compiled. You can simply replace the library file with new version and you can still run your program without recompilation because the interface that you use has not changed.
If your program would have used an implementation-specific feature of the library (outside of the interface), then you would have to change your program.
C++ has a Standard Library with carefully defined interface. There are many different implementations of the library.