- •Операторы динамического распределения памяти
- •Перегрузка функций и операций
- •Объекты и классы Класс как обобщение структуры
- •Определение первичного класса
- •Перегрузка операций
- •Конструкторы
- •Список инициализации
- •Деструктор
- •Дружественные классы
- •Статические элементы класса
- •Шаблоны функций
- •Контейнерные классы Шаблоны классов
- •Параметризованные очереди и стеки
- •Бинарные деревья
- •Определение класса множества
- •Производные классы Доступ к полям и функциям базового класса
- •Класс дерева поиска
- •Параметризованный связный список
- •Множественное наследование
- •Виртуальные классы
- •Виртуальные функции Переопределение составной функции
- •Организация списка объектов различного типа
- •Виртуальные деструкторы
- •Абстрактные классы
Виртуальные функции Переопределение составной функции
Например, рассмотрим класс «фрукты» и производные от него – «яблоки» и «апельсины».
#include <iostream.h>
#include <conio.h>
// Класс фрукты
class fruit
{
public:
void show()
{
cout << "фрукты"<< endl;
}
};
// Класс яблоки
class apple
{
public:
void show()
{
cout << "яблоки" << endl;
}
};
// Класс апельсины
class orange
{
public:
void show()
{
cout << "апельсины" << endl;
}
};
void main()
{
clrscr(); // Очистка экрана
// Создаём объекты
fruit *a = (fruit *)new apple, *b = (fruit *)new orange;
a -> show(); b -> show(); // Выводим сообщения
getch(); // Ожидание нажатия клавиши
}
Организация списка объектов различного типа
// Класс точки
class Point
{
// Собственные элементы
friend MPoint; // Класс MPoint будет дружественным
protected:
// Защищённые элементы
int x,y; // Координаты
int itype; // Тип
Point *next; // Указатель на следующий элемент в списке
public:
// Общедоступные элементы
Point(int a,int b):x(a), y(b), itype(0) {} // Конструктор
virtual void get()
{
// Вывод координат точки
cout << "Point(" << x << ',' << y << ")\n";
}
virtual int type() // Виртуальная функция возвращения типа
{
return itype;
}
};
// Класс линии (производный от класса точки)
class Line: public Point
{
// Собственные элементы
friend MPoint; // Класс MPoint будет дружественным
int x2,y2; // Координаты второго конца линии
Point *next; // Указатель на следующий элемент в списке
public:
// Общедоступные элементы
// Конструктор
Line(int a,int b,int a2,int b2):Point(a,b), x2(a2), y2(b2) {}
virtual void get()
{
// Вывод координат линии
cout << "Line(" << x << ',' << y << ")(";
cout << x2 << ',' << y2 << ")\n";
}
} ;
// Класс списка
class MPoint
{
// Собственные элементы
Point *p; // Указатель на голову списка
public:
// Общедоступные элементы
MPoint() { p = NULL; } // Конструктор
void insert(Point z); // Добавление точки в список
void insert(Line t); // Добавление линии в список
void display(); // Вывод содержимого списка
};
Для того чтобы сделать доступными поля классов Point и Line, объявим класс Mpoint дружественным для этих классов. После добавления тестирующей главной программы получим окончательный текст программы.
#include <conio.h>
#include <iostream.h>
class MPoint;
// Класс точки
class Point
{
// Собственные элементы
friend MPoint; // Класс MPoint будет дружественным
protected:
// Защищённые элементы
int x,y; // Координаты
int itype; // Тип
Point *next; // Указатель на следующий элемент в списке
public:
// Общедоступные элементы
Point(int a,int b):x(a), y(b), itype(0) {} // Конструктор
virtual void get()
{
// Вывод координат точки
cout << "Point(" << x << ',' << y << ")\n";
}
virtual int type() // Виртуальная функция возвращения типа
{
return itype;
}
};
// Класс линии (производный от класса точки)
class Line: public Point
{
// Собственные элементы
friend MPoint; // Класс MPoint будет дружественным
int x2,y2; // Координаты второго конца линии
Point *next; // Указатель на следующий элемент в списке
public:
// Общедоступные элементы
// Конструктор
Line(int a,int b,int a2,int b2):Point(a,b), x2(a2), y2(b2) {}
virtual void get()
{
// Вывод координат линии
cout << "Line(" << x << ',' << y << ")(";
cout << x2 << ',' << y2 << ")\n";
}
} ;
// Класс списка
class MPoint
{
// Собственные элементы
Point *p; // Указатель на голову списка
public:
// Общедоступные элементы
MPoint() { p = NULL; } // Конструктор
void insert(Point z); // Добавление точки в список
void insert(Line t); // Добавление линии в список
void display(); // Вывод содержимого списка
};
// Вывод содержимого списка
void MPoint::display()
{
Point *q = p; // Создаём указатель и устанавливаем его
// на голову списка
while(q) // Пока не дойдём до конца списка
{
q->get(); // Вывод элемента списка
q=q->next; // Переход к следующему элементу
}
}
// Добавление точки в список
void MPoint::insert(Point z)
{
if(!p) // Если список пустой
{
p = new Point(z.x, z.y); // Создаём новый элемент
p->next = NULL; // Следующего элемента пока нет
return; // Выход из функции
}
// Если список не пустой
Point *q = p; // Создаём указатель и устанавливаем его
// на голову списка
// Идём до конца списка
while(q->next)
q = q->next; // Переход к следующему элементу списка
q->next = new Point(z.x,z.y); // Создаём новый элемент
q->next->next = NULL; // Следующего элемента пока нет
}
// Добавление линии в список
void MPoint::insert(Line z)
{
// Если список пустой
if(!p)
{
p = new Line(z.x,z.y,z.x2,z.y2); // Создаём новый элемент
p->next = NULL; // Следующего элемента пока нет
return; // Выход из функции
}
// Если список не пустой
Point *q = p; // Создаём указатель и устанавливаем его
// на голову списка
// Идём до конца списка
while(q->next)
q = q->next; // Переход к следующему элементу списка
q->next = new Line(z.x,z.y,z.x2,z.y2); // Создаём новый элемент
q->next->next = NULL; // Следующего элемента пока нет
}
void main()
{
clrscr(); // Очистка экрана
MPoint a; // Создаём список
Line l1(10,100,-1,0); // Создаём линию
Point p1(1,2); // Создаём точку
a.insert(l1); // Добавляем в список линию
a.insert(l1); // Добавляем в список линию
a.insert(p1); // Добавляем в список точку
a.insert(p1); // Добавляем в список точку
a.insert(l1); // Добавляем в список линию
a.insert(p1); // Добавляем в список точку
a.display(); // Выводим содержимое списка на экран
getch(); // Ожидание нажатия клавиши
}
В результате работы программы на экран будут выведены строки:
Line(10,100)(-1,0)
Line(10,100)(-1,0)
Point(1,2)
Point(1,2)
Line(10,100)(-1,0)
Point(1,2)