Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
примеры к лекциям ООП.doc
Скачиваний:
7
Добавлен:
24.11.2019
Размер:
2.9 Mб
Скачать

Виртуальные функции Переопределение составной функции

Например, рассмотрим класс «фрукты» и производные от него – «яблоки» и «апельсины».

#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)