- •Предисловие
- •1.1. Общие сведения о программах, лексемах и алфавите языка
- •1.3. Идентификаторы и служебные слова
- •2. Константы: целые, вещественные (с плавающей точкой), перечислимые, символьные (литерные), строковые (строки или литерные строки)
- •3. Операции. Знаки операций. Унарные, бинарные и тернарные операции. Приоритеты операций.
- •3.1 Знаки операций
- •3.2 Унарные операции
- •3.3 Бинарные операции.
- •3.4 Приоритеты операций
- •4. Переменные. Определения и описания. Спецификатор typedef.
- •4.1 Переменные. Определения и описания.
- •4.2 Класс памяти
- •5. Базовые и производные типы данных. Массивы. Указатели, ссылки и адреса. Структуры. Поля битов. Объединения
- •5.1 Массивы
- •5.2 Указатели, ссылки и адреса объектов
- •5.3 Структуры
- •5.3 Поля битов
- •5.4 Объединения
- •6. Операторы
- •6.1 Оператор выражение
- •6.2 Пустой оператор
- •6.3 Составной оператор
- •6.4 Оператор if
- •If (выражение) оператор-1; [else оператор-2;]
- •6.5 Оператор switch
- •6.6 Оператор break
- •6.7 Оператор for
- •6.8 Оператор while
- •6.8 Оператор do while
- •6.9 Оператор continue
- •6.10 Оператор return
- •6.11 Оператор goto
- •7. Функции
- •7.1 Определения, описания и вызовы функций
- •7.2 Начальные (умалчиваемые) значения параметров.
- •7.3 Функции с переменным количеством параметров
- •7.4 Перегрузка функций.
- •7.5 Ссылки и параметры-ссылки.
- •7.6 Шаблоны функций.
- •8. Технологии программирования.
- •8.1 Введение.
- •8.2 Модульное программирование.
- •8.3 Нисходящее программирование.
- •8.4 Структурное программирование.
- •8.5 Понятия объекта, класса объектов.
- •8.6 Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.
- •9.1 Тип данных - класс.
- •9.2 Доступность компонентов класса
- •9.3 Конструктор и деструктор
- •9.4 Компоненты-данные и компоненты-функции. Статические и константные компоненты класса
- •10. Указатели на компоненты класса
- •10.1 Указатели на компоненты- данные.
- •10.2 Указатели на компоненты- функции.
- •10.3 Указатель this
- •11. Друзья классов
- •11.1 Дружественная функция
- •11.2 Дружественный класс
- •12. Наследование
- •12.1 Определение производного класса.
- •12.2 Конструкторы и деструкторы производных классов
- •13. Полиморфизм
- •13.1 Виртуальные функции.
- •13.2 Абстрактные классы
- •14. Шаблоны классов
- •15. Перегрузка операций
- •15.1 Общие сведения о перегрузке стандартных операций
- •15.2 Перегрузка унарных операций
- •15.3 Перегрузка бинарных операций
- •15.5 Перегрузка операции вызова функции
- •15.6 Перегрузка операции присваивания
- •15.7 Основные правила перегрузки операций.
- •16. Обработка исключительных ситуаций
- •16.1 Операторы try, throw, catch
- •16.2 Универсальный обработчик исключений
- •17. Структура Windows-приложения
- •17.2 Структура каркасного Windows-приложения
- •17.3 Главная функция WinMain()
- •17.4 Сообщения Windows
- •17.5 Класс окна. Регистрация и его характеристики
- •17.6 Создание и показ окна
- •17.7 Цикл обработки сообщений
- •17.8 Оконная функция
- •17.9 Завершение выполнения приложения
- •18. Препроцессор
- •18.1 Общие пpеобpазования
- •18.2 Директивы Препроцессора
- •18.3 Подключаемые файлы
- •18.4. Директива '#include'.
- •18.5 Однократно подключаемые файлы
- •18.6 Макросы
- •18.7 Стрингификация
- •18.8 Объединение
- •18.9 Удаление макросов
- •18.10 Условия
- •19. Разработка Windows приложений с использованием библиотеки классов mfc (microsoft foundation class library)
- •19.1 Некоторые сведения о программировании Windows-приложений
- •19.2 Преимущества использования mfc
- •19.4 Библиотека mfc
- •20. Простейшие mfc-приложения
- •20.1 Приложение без главного окна
- •20.2 Приложение с главным окном
- •20.3 Обработка окном сообщений
13.2 Абстрактные классы
Абстрактным называется класс, в котором есть хотя бы одна чистая (пустая) виртуальная функция.
Чистой виртуальной называется компонентная функция, которая имеет следующее определение:
virtual тип имя_функции(список_формальных_параметров) = 0;
Чистая виртуальная функция ничего не делает и недоступна для вызовов. Ее назначение – служить основой для подменяющих ее функций в производных классах. Абстрактный класс может использоваться только в качестве базового для производных классов.
Механизм абстрактных классов разработан для представления общих понятий, которые в дальнейшем предполагается конкретизировать. При этом построение иерархии классов выполняется по следующей схеме. Во главе иерархии стоит абстрактный базовый класс. Он используется для наследования интерфейса. Производные классы будут конкретизировать и реализовать этот интерфейс. В абстрактном классе объявлены чистые виртуальные функции, которые по сути есть абстрактные методы.
Пример
class Base{
public:
Base(); // конструктор по умолчанию
Base(const Base&); // конструктор копирования
virtual ~Base(); // виртуальный деструктор
virtual void Show()=0; // чистая виртуальная функция
// другие чистые виртуальные функции
protected:
// защищенные члены класса
private:
// часто остается пустым, иначе будет мешать будущим разработкам
};
class Derived: virtual public Base{
public:
Derived(); // конструктор по умолчанию
Derived(const Derived&); // конструктор копирования
Derived(параметры); // конструктор с параметрами
virtual ~Derived(); // виртуальный деструктор
void Show(); // переопределенная виртуальная функция
// другие переопределенные виртуальные функции
Derived& operator=(const Derived&); // перегруженная операция присваивания
// ее смысл будет понятен после прочтения главы 3
// другие перегруженные операции
protected:
// используется вместо private, если ожидается наследование
private:
// используется для деталей реализации
};
По сравнению с обычными классами абстрактные классы пользуются “ограниченными правам”. А именно:
невозможно создать объект абстрактного класса;
абстрактный класс нельзя употреблять для задания типа параметра функции или типа возвращаемого функцией значения;
абстрактный класс нельзя использовать при явном приведении типов; в то же время можно определить указатели и ссылки на абстрактный класс.
Объект абстрактного класса не может быть формальным параметром функции, однако формальным параметром может быть указатель на абстрактный класс. В этом случае появляется возможность передавать в вызываемую функцию в качестве фактического параметра значение указателя на производный объект, заменяя им указатель на абстрактный базовый класс. Таким образом, мы получаем полиморфные объекты.
Пример
Сформируем односвязный список, содержащий объекты разных классов, производных от одного абстрактного класса.
#include<iostream.h>
#include<string.h>
// Абстрактный класс
class Person
{
public:
Person()
{strcpy(name,"NONAME"); age=0; next=0;};
Person(char*NAME,int AGE)
{ strcpy(name,NAME); age=AGE; next=0;}
virtual~Person(){};
virtual void Show()=0;
virtual void Input()=0;
friend class List; //для того, чтобы в классе List было доступно поле next
protected:
char name[20]; //имя
int age; //возраст
Person* next; //указатель на следующий объект в списке
};
//Производный класс- СТУДЕНТ
class Student:public Person{
public:
Student()
{grade=0;}
Student(char* NAME,int AGE,float GRADE):Person(NAME,AGE)
{grade=GRADE; }
void Show(){cout<<"name="<<name<<" age="<<age<<"grade="<<grade<<endl;}
void Input()
{cout<<"name=";cin>>name;
cout<<"age=";cin>>age;
cout<<"grade=";cin>>grade;}
protected:
float grade;//рейтинг
};
//Производный класс- Преподаватель
class Teacher:public Person{
public:
Teacher()
{work=0;}
Teacher(char* NAME,int AGE,int WORK):Person(NAME,AGE)
{ work=WORK;}
void Show(){cout<<"name="<<name<<" age="<<age<<" work="<<work<<endl;}
void Input()
{
cout<<"name=";cin>>name;
cout<<"age=";cin>>age;
cout<<"work=";cin>>work;}
protected:
int work;//стаж
};
//Класс СПИСОК
class List
{
private:
Person* begin;
public:
List(){begin=0;}
~List();
void Insert(Person*);
void Show();
};
List::~List()
{ Person*r;
while(begin!=0){ r=begin; begin=begin->next; delete r;}
}
void List::Insert(Person*p){
Person *r;
r=begin; begin=p; p->next=r;}
void List::Show()
{Person *r;
r=begin;
while(r!=0)
{r->Show(); r=r->next;}
}
void main()
{
List list;
Student* ps;
Teacher* pt;
ps=new Student("Иванов",21,50.5);
list.Insert(ps);
pt=new Teacher("Котов",34,10);
list.Insert(pt);
ps=new Student;
ps->Input();
list.Insert(ps);
pt=new Teacher;
pt->Input();
list.Insert(pt);
list.Show();
}