Hide unnecessary implementation details. Expose only what the user of your class needs to know.
class Shape { // abstract class
public:
virtual float area() = 0; // pure virtual
};
class Circle : public Shape {
float r;
float area() { return 3.14f * r * r; } // must implement
};
// Shape s; // ERROR — cannot instantiate abstract class
Shape* s = new Circle(); // OK — pointer to abstract