
ОП3
.docxГУАП
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И СЕТЕЙ
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Старший преподаватель |
|
|
|
Д.В. Куртяник |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №3 |
МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ. ПОЛИМОРФИЗМ. |
по курсу: ОСНОВЫ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2022
Цель лабораторной работы: изучение видов наследования и способов их применения; изучение способов использования виртуальных функций, абстрактных классов; получение навыков объектно-ориентированного программирования на языке C++.
Задание на программирование: Используя технологию объектно-ориентированного программирования, разработать программу.
Номер вариант и индивидуальное задание
23. Земельный участок – Способ использования – Комбинации
Описание модели решения:
В заголовочном файле class.h были созданы классы.
В заголовочный файл Header.h были вынесены методы классов.
Базовый класс land_plot – абстрактный, оснащённый конструктором, который при вызове присваивает строкам свои значения. Выделяет область памяти для массива l_array, для последующей демонстрации работы деструктора. Для корректной работы, все деструкторы в программе виртуальные. Базовый класс оснащён виртуальным методом base, который перекрывается в классах, наследующих базовый.
Класс Parkovka оснащён конструктором, который передаёт значение в ранее объявленную строку. Класс Parkovka наследует класс land_plot с модификатором virtual protected. В классе Parkovka перегружен метод base, создан метод is_parkovka, который заполняет строку, в последствии этот метод используется в классах наследниках.
Класс House и Garden имеют подобную структуру, за исключением содержимого, передаваемого в строки.
Класc Zastroyshchik наследует классы Parkovka и House для последующего использования методов, описанных в них. В классе Zastroyshchik перегружен метод базового класса base, метод by_ zastroyshchik заполняет строку с использованием методов наследуемых классов. Конструктор заполняет объявленные ранее строки.
Класс Dachnik работает аналогично классу Zastroyshchik, за исключением передаваемых в строки значений. В файле main.cpp создаются объекты всех представленных классов, за исключением класса land_plot, т.к. он является абстрактным. В главной функции вызываются все методы каждого из классов.
Исходный код:
main.cpp
#include "Header.h"
int main()
{
Parkovka p;
p.base();
cout << p.is_parkovka() << endl;
House h;
h.base();
cout << h.is_house() << endl;
Garden g;
g.base();
cout << g.is_garden() << endl;
Zastroyshchik z;
z.base();
cout << z.by_zastroyshchik() << endl;
Dachnik d;
d.base();;
cout << d.by_dachnik() << endl << endl;
Combinations c(1);
Combinations cc;
cc.base();
cc.get_c();
}
class.h
#include <iostream>
#include <string>
using namespace std;
class land_plot
{
protected:
string b;
string p;
int* l_array;
public:
land_plot()
{
b = " built ";
p = " planted ";
l_array = new int[2];
}
virtual ~land_plot()
{
cout << "land_plot deleted" << endl << endl;
delete[] l_array;
}
virtual void base() = 0;
};
class Parkovka : virtual protected land_plot
{
protected:
string parkovka;
friend class land_plot;
int* p_array;
public:
Parkovka()
{
p_array = new int[2];
parkovka = "parkovka";
}
virtual ~Parkovka()
{
cout << "Parkovka deleted" << endl;
delete[] p_array;
}
void base();
string is_parkovka();
};
class House : virtual protected land_plot
{
protected:
string house;
int* h_array;
public:
House()
{
h_array = new int[2];
house = "house";
}
virtual ~House()
{
cout << "House deleted" << endl;
delete[] h_array;
}
string is_house();
void base();
};
class Garden : virtual protected land_plot
{
protected:
string garden;
int* g_array;
public:
Garden()
{
g_array = new int[2];
garden = "garden";
}
virtual ~Garden()
{
cout << "Garden deleted" << endl;
delete[] g_array;
}
void base();
string is_garden();
};
class Zastroyshchik : virtual protected House, virtual protected Parkovka
{
protected:
string zastroyshchik;
string a;
int* z_array;
public:
Zastroyshchik()
{
z_array = new int[2];
zastroyshchik = " by zastroyshchik";
a = " and ";
}
virtual ~Zastroyshchik()
{
cout << "zastroyshchik deleted" << endl;
delete[] z_array;
}
string by_zastroyshchik();
void base();
};
class Dachnik : virtual protected House, virtual protected Garden
{
protected:
string dachnik;
string a;
int* d_array;
public:
Dachnik()
{
d_array = new int[2];
dachnik = "by dachnik";
a = " and ";
}
virtual ~Dachnik()
{
cout << "Dachnik deleted" << endl;
delete[] d_array;
}
string by_dachnik();
void base();
};
class Combinations : virtual protected Dachnik, virtual protected Zastroyshchik
{
private:
string g = "type of land use:";
int* c_array;
public:
Combinations(int i)
{
switch (i)
{
case 1:
cout << g << by_zastroyshchik() << endl;
break;
case 2:
cout << g << by_dachnik() << endl;
break;
}
}
Combinations()
{
int i = get_c();
switch (i)
{
case 1:
cout << g << by_zastroyshchik() << endl;
break;
case 2:
cout << g << by_dachnik() << endl;
break;
}
}
virtual ~Combinations()
{
cout << "Combinations deleted" << endl;
delete[] c_array;
}
void base();
int get_c();
};
Header.h
#include <iostream>
#include "class.h"
#include <string>
using namespace std;
void Parkovka::base()
{
cout << "Parkovka class" << endl;
}
string Parkovka::is_parkovka()
{
return(parkovka + " is" + b);
}
void House::base()
{
cout << "House class" << endl;
}
string House::is_house()
{
return(house + " is" + b);
}
void Garden::base()
{
cout << "Garden class" << endl;
}
string Garden::is_garden()
{
return(garden + " is" + p);
}
void Zastroyshchik::base()
{
cout << "Zastroyshchik class" << endl;
}
string Zastroyshchik::by_zastroyshchik()
{
return(is_parkovka() + a + is_house() + zastroyshchik);
}
void Dachnik::base()
{
cout << "Dachnik class" << endl;
}
string Dachnik::by_dachnik()
{
return(is_house() + a + is_garden() + dachnik);
}
void Combinations::base()
{
cout << "Combinations class" << endl;
}
int Combinations::get_c()
{
c_array = new int[2];
int a = 0;
cout << "Choose type of land use: " << '\n' <<
"1)Zastroyshchik" << '\n' << "2)Dachnik" << '\n';
cin >> a;
if (a < 1 || a > 2)
{
cout << "Wrong answer!" << '\n';
cin >> a;
}
return (a);
}
Результат работы программы:
Вывод: были изучены виды наследования и способы их применения; изучены способы использования виртуальных функций, абстрактных классов; получены навыки объектно-ориентированного программирования на языке C++.