Абстрактні та віртуальні базові класи



Мы поможем в написании ваших работ!


Мы поможем в написании ваших работ!



Мы поможем в написании ваших работ!


ЗНАЕТЕ ЛИ ВЫ?

Абстрактні та віртуальні базові класи



 

В об'єктно-орієнтованому програмуванні абстрактний клас – це базовий клас, від якого не можна створити екземпляру. На практиці абстрактні класи реалізують один з принципів ООП – поліморфізм. В абстрактному класі можна описати (або не визначити) абстрактні методи та властивості. Абстрактний метод не реалізовується в класі в якому описується, але має бути реалізований в неабстрактному нащадку. Абстрактні класи вважаються найбільшими узагальненими абстракціями, тобто відношення об'єму описів до об'єму реалізації найбільше. Абстрактний клас можна розглядати, як інтерфейс для сімейства класів, які ним породжені, але на противагу класичному інтерфейсу, абстрактний клас може містити реалізацію методів та властивості. Абстрактні методи переважно є і віртуальними, через це поняття «абстрактний» та «віртуальний» інколи плутають.

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

C + + - єдиний з трьох мов, що підтримує множинне успадкування.

 


Перевантаження функцій і операцій

 

Перевантаження функцій:

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

Приклад перевантаження функції:

int function(int a,int b)

{return (a+b); }

int function(int a,int b,int c)

{return ((a+b)*c); }

main()

{

cout<<”Отримані результати функції номер 1”<<function(4,5)<<endl;

cout<<”Отримані результати функції номер 2”<<function(6,7,8)<<endl;

}

Перевантаження операторів:

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

Приклад перевантаження операторів:

class mi

{ int i;

public:

int getI ()

{return i; }

mi (int v)

{i = v;}

mi operator+ (int v)

{mi i1 (i + v); return i1; }

};

int main()

{mi a (5);

mi b = a + 7;

cout << b.getI () << endl;

system("pause>>int");}

При перевантаженні операцій слід пам’ятати наступне:

  1. не можна поміняти пріоритет операцій;
  2. не можна змінити тип операції (з унарної операції не можна зробити бінарну або навпаки);
  3. перевантажена операція є членом класу і може використовуватися тільки у виразах з об'єктами свого класу;
  4. не можна створювати нові операції;
  5. заборонено перевантажувати операції:. (доступ до членів класу), унарну операцію * (значення за адресою вказівника), :: (розширення області видимості),?: (операція if);
  6. допустиме перевантаження наступних операцій: +, -, *, /,%, =, <,>, + =, - =, * =, / =, &&, ||, ++, -, (), [], new , delete.

 

Класи

Інтерфейс і реалізація в класі

 

Інтерфейс - семантична і синтаксична конструкція в коді програми, використовувана для специфікування послуг, наданих класом або компонентом.

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

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

Кожен клас може реалізовувати будь-які доступні інтерфейси. При цьому в класі повинні бути реалізовані всі абстрактні методи, що з'явилися при спадкуванні від інтерфейсів або батьківського класу, щоб новий клас міг бути оголошений неабстрактним.

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

Послідовність символів :: називається оператором області видимості, він показує приналежність функції класу, вказує компілятору, що дана версія функції належить класу. Іншими словами, функція знаходиться в області видимості класу.

 

 

Приклад класу:

class rozklad_potyagiv //Клас "Розклад потягiв"

{

public: //Оголошення публiчного доступу до наведених нижче змiнних та методiв

string punkt_priznachennya; //Оголошення змiнної "Пункт призначення"

string nomer_potyagy; //Оголошення змiнної "Номер потягу"

string chas_vidpravlenya; //Оголошення змiнної "Час вiдправлення"

rozklad_potyagiv(); //Конструктор

void vvod(); //Оглошення методу класу - "Введення даних"

void vuvod(); //Оглошення методу класу - "Виведення даних"

void sort_punkt_priznachnya(); //Оголошення методу сортування

void vuvod_po_poisky(); //Оголошення методу пошуку по часу

~rozklad_potyagiv();

};


Конструктори і деструктори

 

Конструктор викликається щоразу, коли створюється об'єкт даного типу; деструктор — при знищенні. При перетвореннях типів, присвоєнні, передачі параметра теж викликаються конструктори і при необхідності деструктори. Конструктор викликається автоматично. Конструктор – це метод класу, який має ім’я класу, він ініціалізує об’єкти класу. Деструктор руйнує об’єкти, звільняє пам'ять. Він також має ім’я класу, але з символом на початку «~». Конструктор і деструктор протилежні один від одного і завжди оголошуються в розділі public. При оголошення конструктора та деструктора не вказується тип даних, вони не повертають значення. В класі можна створювати декілька конструкторів і вони можуть бути з параметрами, деструктор в класі може бути тільки один.

Приклад:

class rozklad_potyagiv //Клас "Розклад потягiв"

{

public: //Оголошення публiчного доступу до наведених нижче змiнних та методiв

string punkt_priznachennya; //Оголошення змiнної "Пункт призначення"

string nomer_potyagy; //Оголошення змiнної "Номер потягу"

rozklad_potyagiv(); //Конструктор

~rozklad_potyagiv(); //Деструктор

};

rozklad_potyagiv::rozklad_potyagiv() //Конструктор

{

punkt_priznachennya=nomer_potyagy="\nПусто";//Надається змiнним значення "Пусто"}

rozklad_potyagiv::~rozklad_potyagiv() //Деструктор

{

//Працює деструктор

}

6. Потоки введення/виведення С++

 

Введення / виведення на найнижчому рівні інтерпретується як передача послідовності байтів між об'єктами. Ця послідовність байтів називається потоком. На цьому рівні поняття типу даних відсутня. У мові С ++ управління потоками здійснюється за допомогою функцій бібліотеки вводу / виводу, успадкованої від С і оголошеної в заголовному файлі «iostream», або за допомогою операторів потоку введення / виведення. До переваг першого способу відноситься можливість більш гнучкого управління форматуванням і його повна сумісність з С. Використовуючи оператори потоку введення / виводу, можна не замислюватися про форматах виведення інформації, якщо це не має принципового значення. Крім того, цей метод дозволяє перевизначити форму виводу для будь-якого класу.

Функції введення/виведення:
cin>> //Введення;

cout<< //Виведення;

printf ( ) //Виведення;

scanf() //Введення.

Для файлів:

fprintf ( ) //Виведення;

fscanf ( ) //Введення.


 

Динамічний розподіл пам’яті

 

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

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

Завдання виконання запиту розподілу полягає в знаходженні блока невикористаної пам'яті достатнього розміру.

Проблеми при виконанні запиту розподілу:

Внутрішня і зовнішня фрагментації. Зменшення фрагментації потребує особливої уваги, що робить реалізацію складнішою. Виділення метаданих може збільшити кількість (окремих) малих виділень; Формування блоків намагається зменшити цей ефект.

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

Мова С ++ визначає два оператора динамічного виділення пам'яті - new і delete. Операції new і delete призначені для динамічного розподілу пам'яті комп'ютера. Операція new виділяє пам'ять з області вільної пам'яті, а операція delete вивільняє виділену пам'ять. Виділювана пам'ять, після її використання повинна вивільнятися, тому операції new і delete використовуються парами. Навіть якщо не вивільняти пам'ять явно, то вона звільниться ресурсами ОС по завершенню роботи програми. Операція new створює об'єкт заданого типу, виділяє йому пам'ять і повертає вказівник правильного типу на дану ділянку пам'яті. Якщо пам'ять неможливо виділити, наприклад, у разі відсутності вільних ділянок, то повертається нульовий вказівник, тобто вказівник поверне значення 0. Виділення пам'яті можливо під будь-який тип даних: int, float, double, char і т.д.

Приклад:

int * kyrsova = new int;

delete kyrsova;

 


 

Висновок

На данній курсовій роботі було створено базу даних «Розклад потягів» з масивом об’єктів, конструктом, деструктором, методами вводу / виводу, методом сортування по «пункту призначенню» бульбашковим способом, пошуку по часу відправлення. Також в програмі було створено додаткова функція «автозаповнення» і функція «справка». Введення / виведення здійснюється через масив об’єкту «china[5]» (china - китай) класу «rozklad_potyagiv». Функція «автозаповнення» може автоматично заповнити 5 об’єктів масиву china[5].

Функція «справка» виводить дані: який студент створив програму (курсову), на яку тему (Розклад потягів) та з якими можливостями (функціями та методами). Дана програма була протестована різними комбінаціями, для перевірки її робото – здатності.

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

На данній курсовій роботі я закріпив знання по темі «класи» в об’єктно – орієнтованому програмуванні.



Последнее изменение этой страницы: 2016-04-23; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.192.254.246 (0.015 с.)