The abstract class mechanism supports the notion of a general concept,
such as a shape, of which only more concrete variants, such as
circle and square, can actually be used.
An abstract
class can also be used to define an interface for which derived classes
provide a variety of implementations.
An abstract class can be used only as a base class of some other class;
no objects of an abstract class can be created
except as subobjects of a class
derived from it ([basic.def], [class.mem]).
[Example 1: class point {/* ... */};
class shape {// abstract class
point center;
public:
point where(){return center; }void move(point p){ center=p; draw(); }virtualvoid rotate(int)=0; // pure virtualvirtualvoid draw()=0; // pure virtual};
— end example]
An abstract class type cannot be used
as a parameter or return type of
a function being defined ([dcl.fct]) or called ([expr.call]),
except as specified in [dcl.type.simple].
A class is abstract if it has at least one pure virtual
function for which the final overrider is pure virtual.
[Example 3: class ab_circle :public shape {int radius;
public:void rotate(int){}// ab_circle::draw() is a pure virtual};
Since shape::draw() is a pure virtual function
ab_circle::draw() is a pure virtual by default.
The alternative
declaration,
class circle :public shape {int radius;
public:void rotate(int){}void draw(); // a definition is required somewhere};
would make class circle non-abstract and a definition of
circle::draw() must be provided.
Member functions can be called from a constructor (or destructor) of an
abstract class;
the effect of making a virtual call ([class.virtual]) to a pure
virtual function directly or indirectly for the object being created (or
destroyed) from such a constructor (or destructor) is undefined.