Лабораторная работа «Наследование и полиморфизм»

Ключевые понятия: наследование, модификаторы при наследовании, полиморфизм, статический полиморфизм, динамический полиморфизм, виртуальная функция, чисто виртуальная функция, абстрактный класс, интерфейс, перегрузка оператора.

Цель работы: изучить механизмы наследования и полиморфизма с использованием виртуальных функций.

Задание кафедры: Задание: Реализовать на языке C++ концепцию векторной функции скалярного аргумента (с привлечением механизма наследования и виртуальных функций) вида

,

где – параметры элемента вектор-функции;

– скалярный аргумент вектор-функции;

– функция вычисления одного элемента вектор-функции (выбирается пользователем из множества функций, заданных студенту);

– размерность вектор-функции, заданная пользователем.

Количество элементов вектора результата и аргумент x, для которого производится вычисление, задается пользователем. Вид функции, по которому вычисляется значение каждого элемента вектора результата, указывается пользователем из заданного множества параметризованных функций (параметры функций вводятся пользователем для каждого элемента вектора результата отдельно, при формировании вектора функций):

Вар Функция 1 Функция 2   Вар Функция 1 Функция 2
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

Содержание отчета: сведения об авторе и работе, задание кафедры, цель работы, текст программы (указать в комментариях: назначение всех свойств и методов, используемых при наследовании; указать все элементы полиморфизма, используемые для решения поставленной задачи), выводы.

Контрольные вопросы:

1. Зачем нужен механизм наследования?

2. Зачем используются модификаторы при наследовании классов? Какие это модификаторы?

3. Зачем нужен механизм полиморфизма?

4. Что понимается под динамическим полиморфизмом?

5. К какому из видом полиморфизма относится перегрузка оператора?

6. Что такое интерфейс класса?

7. Зачем нужен чисто виртуальный метод? Как он выглядит?

8. Какой класс называется абстрактным?

Пример программы:

//базовый класс фигура

class figure {

public:

//виртуальные методы для реализации механизма динамического полиморфизма

virtual void set_parameters(double *params) = 0;

virtual double calculate_square() = 0;

virtual char *get_figure_name_and_params() = 0;

protected:

double params[2];

};

 

//класс окружность является наследником класса фигура

//считаем, что есть только нулевой параметр - радиус

class circle: public figure {

void set_parameters(double *params) {

this->params[0] = params[0];

}

double calculate_square() {

return 2 * 3.14 * params[0];

}

char * get_figure_name_and_params() {

char *bufer = new char [100];

sprintf(bufer, "Circle, R = %.0lf", params[0]);

return bufer;

};

};

 

//класс прямоугольник является производным от класса фигура

//считаем, что есть 2 параметра - ширина и высота

class rectangle: public figure {

void set_parameters(double *params) {

this ->params[0] = params[0];

this ->params[1] = params[1];

}

double calculate_square() {

return params[0] * params[1];

}

char * get_figure_name_and_params() {

char *bufer = new char[100];

sprintf(bufer, "Rectangle, a = %.0lf, b = %.0lf", params[0],

params[1]);

return bufer;

};

};

 

void main() {

srand(time(0));

int N = 100;

//создаем массив из ссылок на N случайных фигур

figure **fs = new figure *[N];

//определяем конкретные фигуры. Использование механизмов наследования и полиморфизма позволяет присваивать указатель на прямоугольник и окружность к указателю на базовый класс фигура

for (int i = 0; i < N; i++)

if (rand() % 2 == 1)

fs[i] = new rectangle ();

Else

fs[i] = new circle ();

double params[2];

//обращаемся к конкретным фигурам через указатель на базовый класс фигура

for (int i = 0; i < N; i++) {

params[0] = rand() % 20 + 5;

params[1] = rand() % 20 + 5;

fs[i]->set_parameters(params);

}

for (int i = 0; i < N; i++)

printf("%s. S = %.0lf\n", fs[i]->get_figure_name_and_params(),

fs[i]->calculate_square());

}

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: