
- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
6.1.2. Віртуальні функції
Нехай у базовому Base і в похідному Deriv класах визначені однойменні функції func. Якщо створити об'єкти obBase і obDeriv цих класів, то директиви
obBase.func();
і
obDeriv.func();
будуть викликати функцію func відповідного класу. Однак у мові С++ при створенні інтерфейсу класів прийнято використати покажчик на базовий клас:
Base *pGen;
який може містити або адресу екземпляра базового:
pGen=&obBase;
або адресу екземпляра похідного класу:
pGen=&obDeriv;
Якщо звернутися до функції func через такий покажчик, то незалежно від того, адресу якого об'єкта містить покажчик, буде викликана версія func базового класу. Щоб викликати потрібну версію функції func залежно від того, на який тип об'єкта вказує pGen, вводиться віртуальна функція. Така функція визначається в класі Base ключовим словом virtual.
Виртуальні функції дозволяють складати прості універсальні програми для маніпулювання об'єктами різних типів і дозволяють підтримувати в С++ динамічний поліморфізм.
Наведемо приклад, у якому створюється базовий клас – квадрат і похідний клас – паралелепіпед. Класи містять функцію ar() для обчислення площі, вона оголошується як віртуальна:
class Square{
public:
double a;
Square(double a1) {a=a1;};
virtual double ar() {return a*a;};
};
class Parall: public Square{
double h;
public:
Parall (double height,double a): Square (a){h=height;}
double ar() {return 2*a*(a+2*h);};
};
У функції main оголосимо покажчик p класу Square і створимо об'єкт sq1, на який буде вказувати p. Обчислимо площу квадрата за допомогою віртуальної функції ar() і виведемо ії значення на екран. Потім створимо об'єкт par1 похідного класу, привласнимо покажчику p адресу нового об'єкта й виведемо площу паралелепіпеда, звернувшись до функції ar() також через p:
Square *p, sq1(a);
p=&sq1;
cout<<"\nArea of square: "<<p->ar()<<endl;
Parall par1(b,a);
p=&par1;
cout<<"\nArea of parallelepiped: "<<p->ar()<<endl;
6.1.3. Відділення інтерфейсу від реалізації
Для створення зручних додатків інтерфейс класу (оголошення класу) відокремлюється від його реалізації (визначення функцій-членів). Оголошення класу міститься в заголовному файлі .h, щоб воно було доступно будь-якому клієнтові. Визначення функцій-членів класу містяться в файлі реалізації .cpp. При необхідності модифікувати функції, зміни торкаються тільки файлу реалізації.
Приклад додатка, що складається із заголовного файлу Date.h, файлу реалізації Date.cpp і керуючого файлу MyDate.cpp, що містить функцію main.
Заголовний файл Date.h:
#ifndef DATE_H //Запобігання багаторазового
#define DATE_H //включення заголовного файлу
#include <iostream>
using namespace std;
class Date { //Оголошення абстрактного типу Date
int day, month, year;
public:
Date();
void set(int, int, int);
void print();
};
#include "Date.cpp" //Підключення файлу реалізації
#endif
Файл реалізації Date.cpp:
Date :: Date() {
day=1; month=1; year=1;
}
void Date :: set(int d, int m, int y) {
day=d; month=m; year=y;
};
void Date :: print() {
cout <<day<<"."<<month<<"."<<year;
}
Керуючий файл MyDate.cpp:
#include "date.h"
void main(){
Date birthday;
birthday.set(29,3,1980);
birthday.print();
}