Абстрактные классы дают средство для представления в языке общихпонятий, таких, например, как фигура, для которых могут использоватьсятолько конкретные их варианты, например, круг или квадрат. Кроме тогоабстрактный класс позволяет задать интерфейс, разнообразные реализациикоторого представляют производные классы. Абстрактным называется класс, который можно использовать толькокак базовый для некоторого другого класса, т.е. нельзя создатьникакого объекта абстрактного класса кроме того, который представляетбазовый класс для некоторого производного класса. Класс считаетсяабстрактным, если в нем есть хотя бы одна чистая виртуальнаяфункция. При описании класса виртуальная функция описывается какчистая с помощью спецификации-чистой ($$R.9.2). Чистую виртуальнуюфункцию не нужно определять, если только она явно не вызываетсяс помощью конструкции уточненное-имя ($$R.5.1). Рассмотрим пример: class point { /*... */ }; class shape { // абстрактный класс point center; //... public: point where() { return center; } void move(point p) { center=p; draw(); } virtual void rotate(int) = 0; // чистая виртуальная virtual void draw() = 0; // чистая виртуальная //... }; Абстрактный класс нельзя использовать как тип формального параметра,тип возвращаемого значения, а также как тип в операции явногопреобразования типа. Можно описывать указатели и ссылки на абстрактныйкласс, например: shape x; // ошибка: объект абстрактного класса shape* p; // нормально shape f(); // ошибка void g(shape); // ошибка shape& h(shape&); // нормально Чистые виртуальные функции и наследуются как чистые виртуальныефункции, например: class ab_circle: public shape { int radius; public: void rotate(int) { } // ab_circle::draw() чистая виртуальная функция }; Поскольку функция shape::draw() является чистой виртуальной функцией,то такой же будет по определению и функция ab_circle::draw(). Дляприведенного ниже описания класс circle не будет абстрактным, и уфункции circle::draw() где-то должно существовать определение. class circle: public shape { int radius: public: void rotate(int) { } void draw(); // должна быть где-то определена }; Функции-члены можно вызывать из конструктора абстрактного класса,результат прямого или косвенного вызова чистой виртуальной функциидля объекта, созданного с помощью такого конструктора, неопределен.