
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
Встречаются ситуации, когда в базовом классе законченный тип данных точно не определен. Вместо этого в нем может содержаться только базовый набор функций-элементов и переменных, для которых в производном классе определяются все недостающие компоненты. Виртуальные функции в таких классах являются фиктивными и не выполняют никаких действий. Они имеют пустое тело в базовом классе, но в производных классах такие функции обязательно должны быть переопределены.
Чисто виртуальная функция - это виртуальная функция, тело которой не определено. Она используется для того, чтобы отложить выбор реализации функции. Это называется отложенным методом. Чисто виртуальная функция объявляется внутри базового класса.
Конструкция:
virtual тип имя_функции (список_параметров) = 0;
Класс, имеющий хотя бы одну чисто виртуальную функцию, называется абстрактным классом. Такой класс должен задавать основные общие свойства для своих производных классов, но сам не может использоваться для объявления объектов. Но он может использоваться для объявления указателей, которым разрешен доступ к объектам, производным от абстрактного класса. Благодаря этому достигается динамический полиморфизм. Можно также создавать ссылки на абстрактный класс.
Если существует класс, производный от абстрактного класса, и чисто виртуальная функция в нем не определена, то эта функция остается чисто виртуальной и в производном классе, а сам класс также является абстрактным. Бывают случаи, когда абстрактные классы образуют несколько верхних уровней иерархии.
Пример. Создание и использование абстрактного класса.
#include <iostream>
using namespace std;
#include <math.h>
class area { double dim1, dim2; // размеры фигуры
public:
void setdim(double d1, double d2)
{ dim1 = d1;
dim2 = d2;
}
void getdim(double &d1, double &d2)
{ d1 = dim1;
d2 = dim2;
}
virtual double getarea() = 0; // чисто виртуальная функция
};
class rectangle: public area
{ public:
double getarea() { double d1, d2;
getdim(d1, d2);
return d1 * d2;
}
};
class cylinder: public area
{ public:
double getarea() { const double Pi = 3.14159;
double d1, d2;
getdim(d1, d2);
return 2 * Pi *d1 * (d2 + d1);
}
};
class ring: public area
{ public:
double getarea() { const double Pi = 3.14159;
double d1, d2;
getdim(d1, d2);
return Pi * fabs (d1 * d1 - d2 * d2);
}
};
int main()
{ area *Ptr;
rectangle r;
cylinder c;
ring rn;
r.setdim(3.5, 4.7);
c.setdim(9.6, 8.5);
rn.setdim(4.0, 5.0);
Ptr = &r;
cout << "Square of rectangle = " << Ptr->getarea() << endl;
Ptr = &c;
cout << "Square of cylinder = " << Ptr->getarea() << endl;
Ptr = &rn;
cout << "Square of ring = " << Ptr->getarea() << endl;
return 0;
}
Виртуальные деструкторы
В отличие от конструкторов, деструкторы могут быть виртуальными. Если объект удаляется явным образом, с использованием операции delete над указателем базового класса на объект, то вызывается деструктор базового класса данного объекта.
Объявление деструктора базового класса виртуальным приводит к тому, что все деструкторы производных классов становятся виртуальными, даже если они имеют имена, отличные от имени деструктора базового класса. Деструктор базового класса автоматически выполняется после деструктора производного класса.