An abstract class has at least one pure virtual function. You cannot create objects of an abstract class directly. It exists only to be inherited from by concrete classes that implement the pure virtuals.
Abstract classes define interfaces that derived classes must follow. If Shape has pure virtual draw(), every concrete shape like Circle or Square must implement draw() or remain abstract itself.
Use abstract classes to establish contracts. Any class inheriting from your abstract base must provide certain functionality, giving you guarantees about what derived objects can do.