Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_LAB_Part_2_Obyektno-orientov_progr.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
735 Кб
Скачать
☆

Лабораторна робота №3. Успадкування і віртуальні функції

Мета. Одержати практичні навички створення ієрархії класів і використання статичних компонентів класу.

Основний зміст роботи.

Написати програму, в якій створюється ієрархія класів. Включити поліморфні об'єкти в зв'язаний список, використовуючи статичні компоненти класу. Показати використання віртуальних функцій.

Короткі теоретичні відомості

Статичні члени класу

Такі компоненти повинні бути визначені в класі як статичні (static). Статичні дані класів не дублюються при створенні об'єктів, тобто кожен статичний компонент існує в єдиному екземплярі. Доступ до статичного компонента можливий тільки після його ініціалізації. Для ініціалізації використовується конструкція

тип ім'я_класу : : ім'я_даного ініціалізатор;

Наприклад, int complex : : count = 0;

Ця визначення повинно бути розміщене в глобальній області після визначення класу. Тільки при ініціалізації статичне дане класу одержує пам'ять і стає доступним. Звертатися до статичного даного класу можна звичайним способом через ім'я об'єкта

ім'я_об'єкта.ім'я_компонента

Але до статичних компонентів можна звертатися і тоді, коли об'єкт класу ще не існує. Доступ до статичних компонентів можливий не тільки через ім'я об'єкта, але і через ім'я класу

ім'я_класу : : ім'я_компонента

Однак так можна звертатися тільки до public компонентів.

Для звертання до private статичного компонента ззовні можна за допомогою статичних компонентів-функцій. Ці функції можна викликати через ім'я класу.

ім'я_класу : : ім'я_статичної_функції

Приклад.

#include <iostream.h>

class TPoint

{

double x,y;

static int N; // статичний компонент- дане : кількість крапок

public:

TPoint(double x1 = 0.0,double y1 = 0.0){N++; x = x1; y = y1;}

static int& count(){return N;} // статичний компонент-функція

};

int TPoint : : N = 0; //ініціалізація статичного компонент-даного

void main(void)

{TPoint A(1.0,2.0);

TPoint B(4.0,5.0);

TPoint C(7.0,8.0);

cout<<“\nВизначені ”<<TPoint : : count()<<“крапки.”; }

Покажчик this

Коли функція-член класу викликається для обробки даних конкретного об'єкта, для цієї функції автоматично і неявно передається покажчик на той об'єкт, для якого функція викликана. Цей покажчик має ім'я this і неявно визначене в кожній функції класу в такий спосіб

ім'я_класу *const this = адреса_об'єкта

Покажчик this є додатковим схованим параметром кожної нестатичної компонентної функції. При вході в тіло приналежної класу функції this ініціюється значенням адреси того об'єкта, для якого викликана функція. В результаті цей об'єкт стає доступним всередині цієї функції.

В більшості випадків використання this є неявним. Зокрема, кожне звертання до нестатичного функції-члену класу неявно використовує this для доступу до члена відповідного об'єкта.

Прикладом широко розповсюдженого явного використання this є операції зі зв'язаними списками.

Успадкування

Успадкування — це механізм одержання нового класу на основі вже існуючого. Існуючий клас може бути доповнений чи змінений для створення нового класу.

Існуючі класи називаються базовими, а нові – похідними. Похідний клас успадковує опис базового класу; потім він може бути змінений додаванням нових членів, зміною існуючих функцій-членів і зміною прав доступу. За допомогою спадкування може бути створена ієрархія класів, що спільно використовують код і інтерфейси.

Наслідувані компоненти не переміщаються в похідний клас, а залишаються в базових класах.

В ієрархії похідний об'єкт успадковує дозволені для спадкування компонента всіх базових об'єктів (public, protected).

Допускається множинне спадкування – можливість для деякого класу успадковувати компоненти декількох ніяк не зв'язаних між собою базових класів. В ієрархії класів угода щодо приступності компонентів класу наступні:

private – Член класу може використовуватися тільки функціями-членами даного класу і функціями-“друзями” свого класу. У похідному класі він недоступний.

protected – Те ж, що і private, але додатково член класу з даним атрибутом доступу може використовуватися функціями-членами і функціями-“друзями” класів, похідних від даного.

public – Член класу може використовуватися будь-якою функцією, яка є членом даного чи похідного класу, а також до public - членів можливий доступ ззовні через ім'я об'єкта.

Варто мати на увазі, що оголошення friend не є атрибутом доступу і не успадковується.

Синтаксис визначення похідного класу :

class ім'я_класу : список_базових_класів

{список_компонентів_класу};

У похідному класі успадковані компоненти одержують статус доступу private, якщо новий клас визначений за допомогою ключового слова class, і статус public, якщо за допомогою struct

Явно змінити статус доступу, що замовчується, при спадкуванні можна за допомогою атрибутів доступу - private, protected і public, що вказуються безпосередньо перед іменами базових класів.

Конструктори і деструктори похідних класів

Оскільки конструктори не успадковуються, при створенні похідного класу наслідувані їм дані-члени повинні ініціюватися конструктором базового класу. Конструктор базового класу викликається автоматично і виконується до конструктора похідного класу. Параметри конструктора базового класу вказуються у визначенні конструктора похідного класу. У такий спосіб відбувається передача аргументів від конструктора похідного класу конструктору базового класу.

Наприклад.

class Basis

{ int a,b;

public:

Basis(int x,int y){a=x;b=y;}

};

class Inherit:public Basis

{int sum;

public:

Inherit(int x,int y, int s):Basis(x,y){sum=s;}

};

Об'єкти класу конструюються знизу-вверх: спочатку базовий, потім компоненти-об'єкти (якщо вони маються), а потім сам похідний клас. Таким чином об'єкт похідного класу містить у якості підоб’єкта об'єкт базового класу.

Знищуються об'єкти в зворотному порядку: спочатку похідний, потім його компоненти-об'єкти, а потім базовий об'єкт.

Таким чином, порядок знищення об'єкта протилежний стосовно порядку його конструювання.

Віртуальні функції.

До механізму віртуальних функцій звертаються в тих випадках, коли в кожному похідному класі потрібно свій варіант деякої компонентної функції. Класи, що включають такі функції, називаються поліморфними і відіграють особливу роль в ООП.

Віртуальні функції надають механізм пізнього (відкладеного) чи динамічного зв'язування. Будь-яка нестатична функція базового класу може бути зроблена віртуальною, для чого використовується ключове слово virtual.

Приклад.

class base

{

public:

virtual void print(){cout<<“\nbase”;}

. . .

};

class dir : public base

{

public:

void print(){cout<<“\ndir”;}

};

void main()

{

base B,*bp = &B;

dir D,*dp = &D;

base *p = &D;

bp –>print(); // base

dp –>print(); // dir

p –>print(); // dir

}

Таким чином інтерпретація кожного виклику віртуальної функції через покажчик на базовий клас залежить від значення цього покажчика, тобто від типу об'єкта, для якого виконується виклик.

Вибір того, яку віртуальну функцію викликати буде залежати від типу об'єкта, на який фактично (у момент виконання програми) спрямований покажчик, а не від типу покажчика.

Віртуальними можуть бути тільки нестатичні функції-члени.

Віртуальність успадковується. Після того як функція визначена як віртуальна, її повторне визначення в похідному класі (з тим же самим прототипом) створює в цьому класі нову віртуальну функцію, причому специфікатор virtual може не використовуватися.

Конструктори не можуть бути віртуальними, на відміну від деструкторів. Практично кожен клас, що має віртуальну функцію, повинний мати віртуальний деструктор.

Абстрактні класи

Абстрактним називається клас, у якому є хоча б одна чиста (порожня) віртуальна функція.

Чистою віртуальною функцією називається компонентна функція, що має наступне визначення:

virtual тип ім'я_функції(список_формальних_параметрів) = 0;

Чиста віртуальна функція нічого не робить і недоступна для викликів. Її призначення – бути основою для підмінюючих її функцій у похідних класах. Абстрактний клас може використовуватися тільки в якості базового для похідних класів.

Механізм абстрактних класів розроблений для представлення загальних понять, що надалі передбачається конкретизувати. При цьому побудова ієрархії класів виконується за наступною схемою. На чолі ієрархії стоїть абстрактний базовий клас. Він використовується для спадкування інтерфейсу. Похідні класи будуть конкретизувати і реалізувати цей інтерфейс. В абстрактному класі оголошені чисті віртуальні функції, що по суті є абстрактними методи.

Приклад .

class Base{

public:

Base(); // конструктор за замовчуванням

Base(const Base&); // конструктор копіювання

virtual ~Base(); // віртуальний деструктор

virtual void Show()=0; // чиста віртуальна функція

// інші чисті віртуальні функції

protected: // захищені члени класу

private:

// часто залишається порожнім, інакше буде заважати майбутнім розробкам

};

class Derived: virtual public Base{

public:

Derived(); // конструктор за замовчуванням

Derived(const Derived&); // конструктор копіювання

Derived(параметри); // конструктор з параметрами

virtual ~Derived(); // віртуальний деструктор

void Show(); // перевизначена віртуальна функція

// інші перевизначені віртуальні функції

// інші перевантажені операції

protected:

// використовується замість private, якщо очікується спадкування

private:

// використовується для деталей реалізації

};

Об'єкт абстрактного класу не може бути формальним параметром функції, однак формальним параметром може бути покажчик на абстрактний клас. У цьому випадку з'являється можливість передавати у функцію, що викликається, як фактичний параметр значення покажчика на похідний об'єкт, замінюючи ним покажчик на абстрактний базовий клас. У такий спосіб ми одержуємо поліморфні об'єкти.

Абстрактний метод може розглядатися як узагальнення перевизначення. В обох випадках поводження батьківського класу змінюється для нащадка. Для абстрактного методу, однак, поводження просто не визначене. Будь-яке поводження задається в похідному класі.

Одна з переваг абстрактного методу є чисто концептуальною: програміст може думкою наділити потрібною дією абстракцію як завгодно високого рівня. Наприклад, для геометричних фігур ми можемо визначити метод Draw, що їх малює: трикутник TTriangle, окружність TCircle, квадрат TSquare. Ми визначимо аналогічний метод і для абстрактного батьківського класу TGraphObject. Однак, такий метод не може виконувати корисну роботу, оскільки в класі TGraphObject просто немає достатньої інформації для малювання чого-небудь. Проте присутність методу Draw дозволяє зв'язати функціональність (малювання) тільки один раз із класом TGraphObject, а не вводити три незалежні концепції для підкласів TTriangle, TCircle, TSquare.

Є і друга, більш актуальна причина використання абстрактного методу. В об’єктно-орієнтованих мовах програмування зі статичними типами даних, до яких відноситься і С++, програміст може викликати метод класу, тільки якщо компілятор може визначити, що клас дійсно має такий метод. Припустимо, що програміст хоче визначити поліморфну змінну типу TGraphObject, що буде в різні моменти часу містити фігури різного типу. Це припустимо для поліморфних об'єктів. Проте компілятор дозволить використовувати метод Draw для перемінної, тільки якщо він зможе гарантувати, що в класі змінної є цей метод. Приєднання методу Draw до класу TGraphObject забезпечує таку гарантію, навіть якщо метод Draw для класу TGraphObject ніколи не виконується. Природно для того, щоб кожна фігура малювалася по своєму, метод Draw повинний бути віртуальним.

9.1. Приклади програм

Задача 9.1

Визначити клас "рядок" і перевантажити операцію + для з'єднання рядків. Використати різні категорії конструкторів та специфікації доступу до атрибутів.

Об'єктно-орієнтований аналіз

Об'єкт- це рядок. Атрибути (властивості) об'єкта такі: довжина рядка, символи рядка у вигляді масиву символів. Методи об'єкта такі: створення пустого рядка, ініціалізація атрибутів об'єкта, копіювання об'єкта, з'єднання об'єктів. Для створення рядків, що з'єднуються, використовується конструктор, який ініціалізує такі атрибути: ім'я об'єкта та символи рядка. Для створення об'єкта, який є результатом з'єднання рядків, використовується конструктор, який ініціалізує такі атрибути: ім'я об'єкта та довжину об'єднаного рядка. Для з'єднання двох об'єктів використовується операторна функція, яка виконує цю операцію за допомогою стандартної арифметичної операції додавання (+). Під час виконання операції додавання створюється новий об'єкт з атрибутами заданої довжини рядка, іменем об'єкта, який заповнений пустими символами. З'єднання рядків виконується стандартною функці-єю конкатенації. Під час повернення результату з функції з'єднання викликається конструктор копії, який створює новий об'єкт на основі копії вже існуючого. Під час повернення з функції посилання на об'єкт конструктор копії не викликається, тому що функція змінює значення фактичних об'єктів, а не їх копії. Для доступу до закритих атрибутів класу використовується функція доступу, яка повертає значення відповідного атрибута об'єкта.

Об'єктно-орієнтоване програмування

Структура проекту програми 9.1

Текст програми 9.1

//Файл lab9_1.h  - інтерфейс класу

classstroka

{  

private:                       //закриті атрибути класу

            int len; //довжина рядка

public:                        //відкриті атрибути та методи

char name_str[10];   //ім’я об’єкта

charstr[50];               //символи рядка

stroka(char name[10]);                                //конструктор ініціалізації

stroka (stroka& s);                           //конструктор копії

stroka(char name[10],int size);       //конструктор ініціалізації

stroka operator+(stroka& s);          //операторна функція перевантаження операції +

int get();                                             //функція доступу до закритих атрибутів

voidshow();                                      //відображення атрибутів об’єкта

};

//////////////////////////////////////////////////////////////////////////////////////////////////////

//Файл lab9_1.cpp -реалізація класу

#include<stdio.h>                                                    

#include<iostream.h>

#include<string.h>

#include"lab9_1.h"               //підключення заголовного файлу інтерфейсу класу

/////////////////////   конструктор ініціалізації          ////////////////////////

stroka::stroka(charname[10])

{                              //викликається під час створення об’єктів, які будуть з’єднуватися

            strcpy(name_str,name);

            cout<<"Enter string "<<name_str<<endl;

            gets(str);        len=strlen(str);

}

/////////////////////////     конструктор ініціалізації   /////////////////////////

stroka::stroka(char name[10],int size)      

  {     //викликається під час створення об’єкта –результату з’єднання двох інших об’єктів

            strcpy(name_str,name);

            strcpy(str," ");

            len=size; 

 }

///////////////////////  відображення атрибутів об’єкта ///////////////////

voidstroka::show()

{           cout<<"Initialization string  "<<name_str<<endl;

            puts(str);

}

////////////////////////////  конструктор копії  ///////////////////////

 stroka::stroka (stroka& s)           

 /*викликається для копіювання результату з’єднання об’єктів в третій об’єкт  під час повернення результату з операторної функції. Метод відсутній, якщо операторна функція повертає посилання на об’єкт типу stroka& */

    { 

            strcpy(name_str,s.name_str);

             strcpy(str,s.str);

   }

//////////////////////////////////////// операторна функція з’єднання об’єктів/////////////////////////////////

stroka stroka::operator+(stroka& s)                                

{                                        //можливий варіант повертання посилання на об’єкт stroka&

            stroka tmp("str3",len+s.len);                        //створення об’єкта, що повертається

            strcpy(tmp.str,str);

            strcat(tmp.str,s.str);                               //об’єднання рядків

            return tmp;                                               //виклик конструктор копії

}

////////////////////////////////   функція доступу до закритих атрибутів /////////////////////////

intstroka::get()

{           returnlen;   }

/////////////////////////////  ТЕСТОВА ПРОГРАМА   ////////////////////////////////////

voidmain()    {                                                                  

stroka a("str1");                        //ініціалізація першого об’єкта значеннями з клавіатури

a.show();                                                          //відображення атрибутів першого об’єкта

stroka b("str2");                      //ініціалізація другого об’єкта значеннями з клавіатури

b.show();                                                            //відображення атрибутів другого об’єкта

stroka c("str3",a.get()+b.get());      //ініціалізація об’єкта, який є з’єднанням об’єктів

c=a+b;                                                                                         // з’єднання двох  об’єктів

c.show();                                               //відображення атрибутів результуючого об’єкта

}

 

 

 

Задача 9.2

Розробити клас "матриця", який є похідним від класу "вектор". Клас "вектор" є похідним від класу "масив". Використати перевантажені констру-ктори. Виконати операції множення матриці на вектор та додавання матриць.

Об'єктно-орієнтований аналіз

Ієрархія класів подана на рис. 9.1. Базовим класом є клас "масив" (array) з атрибутом - назва масиву (name), похідним від класу "масив" є клас "вектор" (vector) з атрибутами: кількість елементів (row), значення компонентів вектора (mas). Похідним від класу "вектор" є клас "матриця" (matrix) з атрибутами: кіль-кість стовпчиків матриці (column) та значення елементів матриці (matr).

Кожний клас має конструктор об'єктів та метод show() відображення їх атрибутів. Клас "матриця" має методи множення матриці на вектор mult() та додавання матриць add(). Класи мають перевантажені конструктори, які використовуються під час ініціалізації об'єктів в різних умовах.

 

Сценарій взаємодії об'єктів

1. Конструювання об'єкта "вектор" за допомогою конструктора неявно-го об'єкта "масив". 2. Ініціалізіція атрибутів об'єкта "вектор". 3. Відображення значень атрибутів об'єкта "вектор". 4. Конструювання об'єкта "матриця" за допомогою конструктора об'єкта "вектор", який створюється на базі об'єкта "масив". 5. Ініціалізація об'єкта "матриця". 6. Відображення атрибутів об'єкта "матриця". 7. Конструювання та ініціалізація об'єкта "матриця", який додається до першого об'єкта "матриця". 8. Додавання двох об'єктів "матриця". 9. Відображення результатів додавання об'єктів "матриця" 10. Конструювання пустого об'єкта "вектор", для збереження результату множення матриці на вектор. 11. Множення об'єктів "вектор" та першого об'єкта "матриця" з ініціал-зацією об'єкта "вектор", що є результатом множення.

Об'єктно-орієнтоване програмування

Структура проекту програми 9.2

 Текст програми 9.2

//==============Файл  lab9_2.h – інтерфейси класів=======================

class array                                                                                                            //клас масив

{

 public:                                                                                                                           

   char name[10];                                                                                                //ім’я масиву

   array();                                                                                                           //конструктор

   virtual void show();                                                       //відображення атрибутів об’єкта

};

////////////////////////////////////////////////////////       клас вектор     ///////////////////////////////////////////////////

classvector:public array

{ public:                                                                                                               

            intmas[5];                                                                                  //компоненти вектора

            int row;                                                                                    //кількість компонентів

    vector();                                                                                                          //конструктор

    vector(int number_element);                                             //перевантажений конструктор

    virtual void show();                                                      //відображення атрибутів об’єкта

};

/////////////////////////////////////////////////   клас матриця   //////////////////////////////////////////////////////////////

classmatrix:public vector

{ public:                                                                                                   

       intmatr[5][5];                                                                          //елементи матриці

       int  column;//кількість стовпчиків, кількість рядків успадковується з класу вектор

   matrix();                                                                                                          //конструктор

   matrix(int number_column);                                                //перевантажений конструктор

   void show();                                                         //відображення атрибутів об’єкта

   void mult(vector &v);                                                            //множення матриці на вектор

   void add(matrix &other_matr);                                               //додавання матриць

};

//===============Файл lab9_2.срр - реалізація класів =====================//

#include<iostream.h>

#include<stdio.h>

#include<string.h>

#include"lab9_2.h"

intflag=0;                                   //прапорець для визначення типу виведення  атрибутів

array::array()                                             //конструктор ініціалізації атрибутів класу array

{           cout<<"enter name of object"<<endl;

            gets(name);  }

//////////////////////////////// відображення атрибутів об’єкта  //////////////////////////////////////////////////

 void array::show()

{           cout<<name;   }

/////////// конструктор об’єкта vector, посилається на конструктор об’єкта array ////////////

vector::vector():array()

{           puts("enter size of column-vector");

            cin>>row;                                                 //уведення кількості компонентів вектора

            cout<<"enter "<<row<<" values of column-vector "<<endl;

            for(inti=0;i<row;i++) cin>>mas[i];           //уведення значення компонентів

}

/////////конструктор об’єкта vector, посилається на конструктор об’єкта array  /////////////

vector::vector(intnumber_row):array()

{           row=number_row;   

}

///////////////////////////////  метод відображення атрибутів об’єкта /////////////////////////////////////////

 void vector::show()

{           cout<<"vector atributes: name=";

            array::show();

            cout<<"  row="<<row<<endl;

            cout<<" values of column-vector:"<<endl;

            for(inti=0;i<row;i++) cout<<mas[i]<<endl;

}

/////////////////////////////    метод додавання матриць      ////////////////////////////////////////////////////

voidmatrix::add(matrix &other_matr)

{                                                                                     //визначення можливості додавання

            if((row==other_matr.row)&&(column==other_matr.column))

             for(inti=0;i<row;i++)

                         for(intj=0;j<column;j++)

                                    matr[i][j]+=other_matr.matr[i][j];

            else     {  cout<<"adding is impossible"<<endl;

                            flag=1; }                                                  //ознака неможливості додавання

}

///////////////////////////////// метод  множення матриці на вектор /////////////////////////////////////////////

voidmatrix::mult(vector &v){          

            vector result(column);                                                   //об’єкт результату множення

            if(v.row==column)                                           //умова можливості множення

            {    for (inti=0;i<row;i++)

                        {           result.mas[i]=0;

                                   for(intj=0;j<column;j++)

                                        result.mas[i]+=matr[i][j]*v.mas[j];                                  

                        }

            }

            else     cout<<"multiplication is impossible"<<endl;

          result.show();                                      //відображення результатів множення

}

/////////////////////////////////////   конструктор матриці   ////////////////////////////////////////////////////////////

matrix::matrix(intnumber_row):vector(number_row)           

 {   char answer;       //символ-відповідь на питання про необхідність уведення даних

      cout<<"do you want to enter row ?y/n:";

      cin>>answer;   

      if(answer=='n')        //якщо кількість рядків не вводиться, то вона успадковується

       {   

           cout<<"row is defined by vector"<<endl;

            row= number_row;  

       }

     else                                            //потрібне введення нового значення кількості рядків

        {  cout<<"enter row of matrix: ";

            cin>>row;   

        }

     cout<<"enter column of matrix"<<endl;   

     cin>>column;                                                                    //уведення кількості стовпчиків

     cout<<"enter "<<row<<"*"<<column<<" values of object's elements "<<endl;

     for(inti=0;i<row;i++)                                                          //уведення елементів матриці

            for(intj=0;j<column;j++)

                 cin>>matr[i][j];

  }

 void matrix::show()

 {

            puts("");         

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

             {

                         for (int j = 0; j < column; j++)

                         {

                                    printf("%3d", matr[i][j]);

                         }

             puts("");

             }

             puts("");

 }

//////////////////////////////////        тестова програма    //////////////////////////////////////

void main()

 {   puts("inheritance -lab9_2");

     vector vec;   vec.show();//конструювання вектора та відображення його атрибутів

     int size_row=vec.row;  //формування аргументу для конструктора об’єкту матриці

     cout<<"matrix1: ";

     matrix mat1(size_row);                                                       //конструювання матриці

     mat1.show();                                                                           //відображення матриці

     cout<<"matrix2: ";   

     matrix mat2(size_row); 

     mat2.show();                                         //конструювання матриці та її відображення

     mat1.add(mat2);                                                                         //додавання матриць

     if(flag==0) 

       {    cout<<"result of matrix adding"<<endl;

             mat1.show();

        }

     cout<<"result of  multiplication matrix by vector"<<endl;

     mat1.mult(vec);   getchar();   //множення матриці на вектор, затримка зображення

}

 

Порядок виконання роботи.

1.Визначити ієрархію класів (відповідно до варіанта).

2.Визначити в класі статичний компонент - покажчик на початок зв'язаного списку об'єктів і статичну функцію для перегляду списку.

3.Реалізувати класи.

4.Написати демонстраційну програму, у якій створюються об'єкти різних класів і поміщаються в список, після чого список проглядається.

5.Зробити відповідні методи не віртуальними і подивитися, що буде.

6.Реалізувати варіант, коли об'єкт додається в список при створенні, тобто в конструкторі (дивися пункт 6 наступного розділу).

Методичні вказівки.

1.Для визначення ієрархії класів зв'язати відношенням спадкування класи, приведені в додатку (для заданого варіанта). З перерахованих класів вибрати один, який буде стояти на чолі ієрархії. Це абстрактний клас.

2.Визначити у класах усі необхідні конструктори і деструктор.

3.Компонентні дані класу потрібно специфікувати як protected.

4.Приклад визначення статичних компонентів:

static person* begin; // покажчик на початок списку

static void print(void); // перегляд списку

5.Статичну компоненту-дане потрібно ініціювати поза визначенням класу, у глобальній області.

6.Для додавання об'єкта в список варто передбачити метод класу, тобто об'єкт сам додає себе в список. Наприклад, a.Add() - об'єкт a додає себе в список.

Включення об'єкта в список можна виконувати при створенні об'єкта, тобто помістити оператори включення в конструктор. У випадку ієрархії класів, включення об'єкта в список повинний виконувати тільки конструктор базового класу. Ви повинні продемонструвати обидва ці способи.

7.Список проглядається шляхом виклику віртуального методу Show кожного об'єкта.

8.Статичний метод перегляду списку викликайте не через об'єкт, а через клас.

9.Визначення класів, їхню реалізацію, демонстраційну програму помістити в окремі файли.

Зміст звіту.

1.Титульний лист: назва дисципліни, номер і найменування роботи, прізвище, ім'я, по батькові студента, дата виконання.

2.Постановка задачі. Варто дати конкретну постановку, тобто вказати які класи повинні бути реалізовані, які повинні бути в них конструктори, компоненти-функції і т.д.

3.Ієрархія класів у виді графа.

4.Визначення класів користувача з коментарями.

5.Реалізація конструкторів з параметрами і деструктора.

6.Реалізація методів для додавання об'єктів в список .

7. Реалізація методів для перегляду списку.

8.Лістінг демонстраційної програми.

9.Пояснення необхідності віртуальних функцій. Варто показати, які результати будуть у випадку віртуальних і не віртуальних функцій.

Варіант 1

  1. Створити абстрактний клас Figure з методами обчислення площі і периметра, а також методом, що виводить інформацію про фігуру на екран.

  2. Створити похідні класи: Rectangle (прямокутник), Circle (круг), Triangle (трикутник) з своїми методами обчислення площі і периметра.

  3. Створити масив n фігур і вивести повну інформацію про фігури на екран.

Варіант 2

  1. Створити абстрактний клас Function з методом обчислення значення функції y=f(x) в заданій точці

  2. Створити похідні класи: Line (y=ax+b), Kub (y=ax2+bx+c), Hyperbola з своїми методами обчислення значення в заданій точці.

  3. Створити масив n функцій і вивести повну інформацію про значення даних функцій в точці х.

Варіант 3

  1. Створити абстрактний клас Видання з методами дозволяючими вивести на екран інформацію про видання, а також визначити чи є дане видання шуканим.

  2. Створити похідні класи: Книга (назва, прізвище автора, рік видання, видавництво), Стаття (назва, прізвище автора, назва журналу, його номер і рік видання), Електронний ресурс (назва, прізвище автора, посилання, анотація) з своїми методами виведення інформації на екран.

  3. Створити каталог (масив) з n видань, вивести повну інформацію з каталога, а також організувати пошук видань по прізвищу автора.

Варіант 4

  1. Створити абстрактний клас Trans з методами дозволяючими вивести на екран інформацію про транспортний засіб, а також визначити вантажопідйомність транспортного засобу.

  2. Створити похідні класи: Легковая_машина (марка, номер, швидкість, вантажопідйомність), Мотоцикл (марка, номер, швидкість, вантажопідйомність, наявність коляски, при цьому якщо коляска відсутня, то вантажопідйомність рівна 0), Грузовик (марка, номер, швидкість, вантажопідйомність, наявність причепа, при цьому якщо є причіп, то вантажопідйомність збільшується в два рази) з своїми методами виведення інформації на екран, і визначення вантажопідйомності.

  3. Створити базу (масив) з n машин, вивести повну інформацію з бази на екран, а також організувати пошук машин, що задовольняють вимогам вантажопідйомності.

Варіант 5

  1. Створити абстрактний клас Persona з методами, дозволяючим вивести на екран інформацію про персону, а також визначити її вік (на момент поточної дати).

  2. Створити похідні класи: Абітурієнт (прізвище, дата народження, спеціальність), Студент (прізвище, дата народження, факультет, курс), Викладач (прізвище, дата народження, посада, стаж), з своїми методами виведення інформації на екран, і визначення віку.

  3. Створити базу (масив) з n персон, вивести повну інформацію з бази на екран, а також організувати пошук персон, чий вік потрапляє в заданий діапазон.

Варіант 6

  1. Створити абстрактний клас Товар з методами, дозволяючим вивести на екран інформацію про товар, а також визначити, чи відповідає вона терміну придатності на поточну дату.

  2. Створити похідні класи: Продукт (назва, ціна, дата виробництва, термін придатності), Партія (назва, ціна, кількість шт, дата виробництва, термін придатності), Комплект (назви, ціна, перелік продуктів) з своїми методами виведення інформації на екран, і визначення відповідності терміну придатності.

  3. Створити базу (масив) з n товарів, вивести повну інформацію з бази на екран, а також організувати пошук простроченого товару (на момент поточної дати).

Варіант 7

  1. Створити абстрактний клас Товар з методами, що дозволяють вивести на екран інформацію про товар, а також визначити, чи відповідає вона шуканому типу.

  2. Створити похідні класи: Іграшка (назва, ціна, виробник, матеріал, вік, на який розрахована), Книга (назва, автор, ціна, видавництво, вік, на який розрахована), Спорт-інвентар (назва, ціна, виробник, вік, на який розрахована), з своїми методами виведення інформації на екран, і визначення відповідності шуканому типу.

  3. Створити базу (масив) з n товарів, вивести повну інформацію з бази на екран, а також організувати пошук товарів певного типу.

Варіант 8

  1. Створити абстрактний клас Телефонний_довідник з методами, що дозволяють вивести на екран інформацію про записи в телефонному довіднику, а також визначити відповідність запису критерію пошуку.

  2. Створити похідні класи: Персона (прізвище, адреса, номер телефону), Організація (назва, адреса, телефон, факс, контактна особа), Друг (прізвище, адреса, номер телефону, дата народження) з своїми методами виведення інформації на екран, і визначення відповідності шуканому типу.

  3. Створити базу (масив) з n товарів, вивести повну інформацію з бази на екран, а також організувати пошук в базі по прізвищу.

Варіант 9

  1. Створити абстрактний клас Клієнт з методами, що дозволяють вивести на екран інформацію про клієнтів банку, а також визначити відповідність клієнта критерію пошуку.

  2. Створити похідні класи: Вкладник (прізвище, дата відкриття внеску, розмір внеску, відсоток по внеску), Кредитор (прізвище, дата видачі кредиту, розмір кредиту, відсоток по кредиту, залишок боргу), Організація (назва, дата відкриття рахунку, номер рахунку, сума на рахунку) з своїми методами виведення інформації на екран, і визначення відповідності даті (відкриття внеску, видачі кредиту, відкриття рахунку).

  3. Створити базу (масив) з n клієнтів, вивести повну інформацію з бази на екран, а також організувати пошук клієнтів, що почали співробітничати з банком в задану дату.

Варіант 10

  1. Створити абстрактний клас Программне_забезпечення з методами, що дозволяють вивести на екран інформацію про програмне забезпечення, а також визначити відповідність можливості використовування (на момент поточної дати).

  2. Створити похідні класи: Вільне (назва, виробник), Умовно-безкоштовне (назва, виробник, дата установки, термін безкоштовного використовування), Комерційне (назва, виробник, ціна, дата установки, термін використовування) з своїми методами виведення інформації на екран, і визначення можливості використовування на поточну дату.

  3. Створити базу (масив) з n видів програмного забезпечення, вивести повну інформацію з бази на екран, а також організувати пошук програмного забезпечення, яке допустимо використовувати на поточну дату.

Приклад коду в консольному режимі VS С++2008

ПРИКЛАД 1 Реалізація простого (одиничного) однорівневого успадкування.

// p1.cpp : Defines the entry point for the console application.

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

class B {

int b;

public:

void setb(int n){b=n;}

void showb(){cout<<"in B b="<<b<<endl;}

};

class D: public B {

int d;

public:

void setd(int n){d=n;}

void showd(){cout<<"in D d="<<d<<endl;}

};

//void main()

int _tmain(int argc, _TCHAR* argv[])

{ D qq; //объявление объекта порожденного класса

qq.setb(1); //доступ к члену базового класса qq.x

qq.showb(); //доступ к члену базового класса

qq.setd(2); //доступ к члену производного класса qq.y

qq.showd(); //доступ к члену производного класса

qq.showb(); //доступ к члену базового класса

getch();

return 0;

}

//=== Результат работы ===

in B b=1 //qq.x

in D d=2 //qq.y

in B b=1 //qq.x

2. Завдання для самостійниго виконання

Додаток. Варіанти завдань

Перелік класів.

1. студент, викладач, персона, зав. кафедрою

2. службовець, персона, робітник, інженер

3. робітник, кадри, інженер, адміністрація

4. деталь, механізм, виріб, вузол

5. організація, страхова компанія, суднобудівна компанія, завод

6. журнал, книга, друковане видання, підручник

7. тест, іспит, випускний іспит, випробовування

8. місце, область, місто, мегаполіс

9. іграшка, продукт, товар, молочний продукт

10. квитанція, накладна, документ, чек

11. автомобіль, потяг, транспортний засіб, експрес

12. двигун, двигун внутрішнього згоряння, дизель, турбореактивний двигун

13. республіка, монархія, королівство, держава

14. ссавці, парнокопитні, птаха, тварина

15. корабель, пароплав, вітрильник, корвет

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]