Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2011
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Інші

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет „ Львівська політехніка “ Кафедра ЕОМ Звіт З Лабораторної роботи №6:“ Наслідування” МЕТА РОБОТИ: ПОЗНАЙОМИТИСЯ ІЗ НАСЛІДУВАННЯМ. Короткі теоретичні відомості Визначення класу Наслідування (ієрархія "іs a") Наслідування – це механізм, за допомогою якого один клас може одержувати атрибути та функції іншого. Наслідування дозволяє створювати ієрархію класів. При створенні нового класу замість написання цілком нових даних-елементів і функцій-елементів програміст може вказати, що новий клас є спадкоємцем елементів попередньо визначеного базового класу. Новостворений клас буде похідним класом. Кожен похідний клас може бути кандидатом на роль базового класу для майбутніх похідних класів. При одиночному наслідуванні клас породжується одним базовим класом. При множинному наслідуванні похідний клас успадковує властивості декількох базових класів. Нижче наведена основна форма наслідування базового класу: class ім’яПохідногоКласу : [public/protected/private] ім’яБазовогоКласу { // тіло похідного класу }   За допомогою специфікатора доступу можна визначити, яким чином елементи базового класу будуть успадковуватися похідним класом. При використанні publіc у похідному класі члени базового класу мають ті ж специфікатори доступу, що й у базовому класі. Специфікатор protected означає, що в похідному класі відкриті члени базового класу стають захищеними, а інші зберігають своє вихідне значення специфікатора доступу. Нарешті, при використанні специфікатора prіvate у похідному класі всі члени базового класу стають закритими. Слід дотримуватися наступних правил успадкування методів у похідному класі: 1. Оскільки конструктори не успадковуються, похідні класи повинні мати власні конструктори. Тут можуть бути дві ситуації: якщо у конструкторі похідного класу відсутній явний виклик конструктора базового класу, автоматично викликається конструктор базового класу по замовчуванню (той, що не має параметрів). Для ієрархії декількох рівнів конструктори базових класів викликаються, починаючи з найвищого рівня. якщо конструктор базового класу потребує параметрів, він повинен бути явно викликаний в конструкторі похідного класу списком ініціалізації. ім’яКласу :: ім’яКласу (параметри) : ім’яБазовогоКласу(параметри) { // тіло конструктора }   2. Оскільки деструктор не успадковуються та програмою не визначений деструктор у похідному класі, його буде згенеровано по замовчуванню і через нього викликано деструктори усіх базових класів. У класовій ієрархії деструктори викликаються у порядку, зворотному до виклику конструкторів; спочатку деструктор поточного класу, а потім деструктор базового класу. 3. Похідний клас може перевизначати метод з одним і тим же ім'ям, що і у базовому класі, відповідно коректуючи його поведінку для себе. Аби запобігти неоднозначностям, рекомендовано перевизначати лише віртуальні методи класів. Функція оголошується віртуальною за допомогою ключового слова virtual, що передує прототипу функції в базовому класі. Абстрактні базові класи і конкретні класи Коли ми думаємо про клас як про тип, ми припускаємо, що будуть створюватися об'єкти цього типу. Однак, існують випадки, в яких корисно визначати класи, для яких програміст не має наміру створювати об'єкти. Такі класи називаються абстрактними класами. Оскільки вони застосовуються як базові класи в процесі наслідування, ми звичайно будемо називати їх абстрактними базовими класами. Об'єкти абстрактного базового класу не можуть бути реалізовані. Єдиним призначенням абстрактного класу є створення відповідного базового класу, від якого інші класи можуть успадкувати інтерфейс і реалізацію. Класи, об'єкти яких можуть бути реалізовані, називаються конкретними класами. Клас робиться абстрактним шляхом оголошення хоча б однієї його віртуальної функції чисто віртуальною. Чисто віртуальною функцією є така функція, у якої в її оголошенні тіло визначене як 0. Наприклад: vіrtual тип ім’яМетода (параметри) = 0;   Якщо клас є похідним від класу з чистою віртуальною функцією і якщо ця чисто віртуальна функція не описана в похідному класі, то функція залишається чисто віртуальною й у похідному класі. А отже і похідний клас залишається абстрактним класом. Ієрархія не вимагає обов'язкового використання абстрактний класів. Але на практиці багато програм, що використовують об’єктно-орієнтований підхід, мають ієрархію класів, породжену абстрактним базовим класом. У деяких випадках абстрактні класи складають кілька верхніх рівнів ієрархії. Завдання: Варіант №4 Створити оголошення класів згідно варіанту. Розробити програму-драйвер, яка продемонструє роботу похідного класу. 4 Базовий клас: class Shape2D { public: Shape2D(); virtual ~ Shape2D(); virtual float Area( )= 0; virtual float Perimeter() = 0; virtual void PrintMessage(); }; Shape2D() – конструктор базового класу. ~ Shape2D() – деструктор базового класу. Area() – повертає значення площі фігури. Perimeter() – повертає значення периметру фігури. PrintMessage() – виводить повідомлення про тип фігури. Похідні класи Triangle та Rectangle Визначити необхідні для похідних класів параметри та перевизначити необхідні функції.   Програма: Main.cpp #include<iostream> #include "Shape2D.h" #include "Rectangl.h" #include "Triangle.h" using namespace std; void main(void) { setlocale(0,""); float a,b,c; int i; while(1) { cout<<"\n МЕНЮ: \n1-Трикутник\n2-Прямокутник\n3-Вихiд:\n"; cin >> i; switch(i) { case 1: { cout << "ТРИКУТНИК:\n"; cout << "Введiть першу сторону трикутника:\n"; cin >> a; cout << "Введiть другу сторону трикутника:\n"; cin >> b; cout << "Введiть третю сторону трикутника:\n"; cin >> c; Triangle *tri; tri =new Triangle(a,b,c); cout<<"Площа:" << tri->Area()<<"\n"; cout<<"Перемитр:"<<tri->Perimetr()<<"\n"; tri->PrintMessege(); tri->Getside(); delete[] tri; break; } case 2: { cout<< "ПРЯМОКУТНИК:\n"; cout << "Введiть першу сторону чотирикутника:\n"; cin >> a; cout << "Введiть другу сторону чотирикутника:\n"; cin >> b; Rectangl *rec; rec =new Rectangl(a,b); cout<< "\n"<<"Площа:" << rec->Area(); cout<< "\n"<< "Перемитр:"<<rec->Perimetr()<<"\n"; rec->PrintMessege(); rec->Getside(); delete [] rec; break; } case 3: { return; } } } } Shape2D.cpp #include"Shape2D.h" #include<iostream> using namespace std; Shape2D::Shape2D() { cout<<"Constructor 2D Shape \n"; } Shape2D::~Shape2D() { cout<<"Destructor 2D Shape \n"; } void Shape2D::PrintMessege() { cout<<" This is 2D Shape"; } Shape2D.h #ifndef SHAPE2D_H #define SHAPE2D_H #include <iostream> using namespace std; class Shape2D { public: Shape2D(); virtual ~Shape2D(); virtual float Area()=0; virtual float Perimetr()=0; virtual void PrintMessege(); }; #endif Rectangl.cpp #include "Rectangl.h" using namespace std; Rectangl::Rectangl() { st1=0; st2=0; } Rectangl::Rectangl(float s1,float s2) { st1=s1; st2=s2; } Rectangl::~Rectangl() { } float Rectangl::Perimetr() { return (st1+st2)*2; } float Rectangl::Area() { return st1*st2; } void Rectangl::PrintMessege() { cout << "Shape type is Rectangl \n"; } void Rectangl::Getside() { cout <<"\n"<< "side a="<< st1 <<"\nside b="<< st2<<"\n"; } Rectangl.h #ifndef RECTANGL_H #define RECTANGL_H #include <iostream> #include "shape2d.h" class Rectangl : public Shape2D { public: Rectangl(); ~Rectangl(); Rectangl(float s1,float s2); float Perimetr(); float Area(); void Getside(); void PrintMessege(); private: float st1,st2; }; #endif Triangle.cpp #include "Triangle.h" using namespace std; Triangle::Triangle() { s1=0; s2=0; s3=0; } Triangle::Triangle(float st1,float st2, float st3) { s1=st1; s2=st2; s3=st3; } Triangle::~Triangle() { cout<<"Destructor Triangle \n"; } float Triangle::Perimetr() { return s1+s2+s3; } float Triangle::Area() { float t; t=s1+s2+s3/2; return sqrt(t*(t-s1)*(t-s2)*(t-s3)); } void Triangle::PrintMessege() { cout << "Shape type is Triangle"; } void Triangle::Getside() { cout <<"\n"<< "side a="<< s1 <<"\nside b="<< s2 <<"\nside c="<< s3<<"\n"; } Triangle.h #ifndef TRANGLE_H #define TRANGLE_H #include <iostream> #include "shape2d.h" class Triangle :public Shape2D { public: Triangle(); ~Triangle(); Triangle(float st1,float st2, float st3); float Perimetr(); float Area(); void Getside(); void PrintMessege(); private: float s1, s2, s3; }; #endif / Висновок: На лаборторній роботі № я навчився працювати з наслідуванням класів класів .
Антиботан аватар за замовчуванням

05.06.2014 12:06-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!