The point of an abstract class is to define (restrict) your interface, without describing the implementation.
An abstract class can be instantiated by constructing a compatible object with a derived class type.
To implement a clean interface that hides ugly platform specific code. Also to hide privates from any sort of exposure. (So that you are truly forced to use the class with the abstracted interface.)
It is necessary when you have two different implementations of the same class that are radically different. Think of a file, a socket, and a block of memory. All of them can make readable data available -- using an abstract class you can implement those three in the three different ways, even though the using code (the call-sites) is written one way to support all three.