Professional Documents
Culture Documents
5 Види відношень, friend функції, види спадкувань
5 Види відношень, friend функції, види спадкувань
програмування
Максим Михайлович Древаль
m.dreval@kpi.ua
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 1
У попередній серії…
➢ Діаграма класів
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 2
Нагадування
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 3
Відношення (асоціації)
Види відношень
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 4
Проста асоціація
за напрямком за кратністю
одностороння бінарна
двостороння тернарна
n-арна
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 5
Одностороння асоціація
lives in
Alice House
1 1
drives
Alice Car
1 *
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 6
Двостороння асоціація
works for
Employee Company
* 1
friend
Alice Bob
1 1
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 7
Бінарна асоціація
works for
Employee Company
* 1
drives
Alice Car
1 *
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 8
Тернарна асоціація
Student Teacher
* 1
*
Course
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 9
n-арна асоціація
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 10
Агрегація та композиція
Head
1
Body
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 11
Дружні функції та класи
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 12
Дружні функції
Приклад
class X {
int a, b;
public:
void memberFunction();
…
}
➢ Глобальна функція:
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 13
Оголошення дружніх функцій
➢ Для того, щоб отримати доступ до захищених членів класу X, функція
doSomething() має бути оголошена дружньою функцією.
class X {
int a, b;
public:
…
friend void doSomething (X obj);
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 14
Оголошення дружніх функцій
➢ Сигнатури дружніх функції розміщуються в оголошенні класу
class X {
…
private:
friend void doSomething (X obj);
public:
friend void doAnything (X obj);
…
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 15
Визначення дружніх функцій
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 16
Дружні класи
class X {
friend class Y;
…
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 17
Оголошення дружніх класів
Приклад
class X {
friend class Y;
private:
int x_var1, x_var2;
…
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 18
Визначення дружніх класів
class Y {
private:
int y_var1, y_var2;
X objX;
public:
void setX() {
objX.x_var1 = 1;
}
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 19
Використання дружніх класів
int main() {
Y objY;
objY.setX();
return 0;
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 20
Спадкування.
Види спадкування в C++
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 21
Спадкування
Спадкування (наслідування) — це властивість ієрархічної
системи, яка дозволяє описати новий клас на основі вже
існуючого з частково або повністю запозиченим функціоналом.
➢ Наприклад:
➢ папуга є птах;
➢ долар є різновидом валюти;
➢ банк не є банківським рахунком.
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 22
Базові та похідні класи
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 23
Спадкування
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 24
Застосування спадкування
#include <iostream>
using namespace std;
class Electronic {
public:
int serial_number = 12345678;
void turn_on() {
cout << "Electronic is on" << endl;
}
private:
int pincode = 87654321;
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 25
Застосування спадкування
int main() {
Phone Myphone;
Myphone.turn_on();
cout << "Serial number is: " <<
Myphone.serial_number << endl;
return 0;
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 26
Спадкування на діаграмах класів
UML-нотація
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 27
Види спадкування: public
public
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 28
Види спадкування: protected
protected
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 29
Види спадкування: protected
Приклад
GrandParent
Parent
Child
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 30
Види спадкування: protected
class GrandParent {
public:
void doSomething();
};
class GrandParent { … };
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 33
Види спадкування: private
Приклад
class Collection {
…
public:
void addElement(int);
bool searchElement(int);
bool searchElementAgain(int);
bool deleteElement(int);
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 34
Види спадкування: private
void Set::addMember(int i) {
if (!isMember(i)) addElement(i);
}
bool Set::isMember(int i) {
return searchElement(i);
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 35
Види спадкування: private
class Parent { … };
class Child: private Parent { … };
int main() {
Child cObj;
Parent *pPtr = &cObj; // Error
return 0;
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 36
Види спадкування: private
Child::Child() {
Parent& pPtr = static_cast<Parent&>(*this);
doSomething(pPtr);
// doSomething(*this);
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 37
Види спадкування: private
class Parent {
public:
Parent() {
cout << “Parent Constructor”;
}
Parent (const Parent& prhs) {
cout << “Parent Copy Constructor”;
}
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 38
Види спадкування: private
class Child: private Parent {
public:
Child() {
cout << “Child Constructor”;
}
Child (const Child& crhs) : Parent (crhs) {
cout << “Child Copy Constructor”;
}
};
int main() {
Child cObj1;
Child cObj2 = cObj1;
// Child cObj2(cObj1);
return 0;
}
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 39
Види спадкування: private
Результат виконання
Parent Constructor
Child Constructor
Parent Copy Constructor
Child Copy Constructor
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 40
Види спадкування: private
➢ У випадку private-спадкування похідний клас, який розташований нижче,
ніж на один рівень за ієрархією:
➢ не може отримати доступ до членів базового класу;
➢ не може перетворити вказівник/посилання на об’єкт похідного класу у
вказівник/посилання на об’єкт базового класу.
class GrandParent {
public:
void doSomething();
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 42
Види спадкування
class B: public A {
class A { // x is public
public: // y is protected
int x; // z is not accessible from B
protected: };
int y;
class C: protected A {
private:
// x is protected
int z;
}; // y is protected
// z is not accessible from C
};
class D: private A { // private is default
// x is private
// y is private
// z is not accessible from D
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 43
Спеціалізація (обмеження)
➢ Спеціалізація (обмеження) — це вид зв’язку спадкування (нагадування:
встановлюється на етапі проектування), за якого похідний клас
поведінково несумісний з базовим класом, тобто базовий клас не завжди
може бути замінений похідним класом.
Person
age : [0..125] age = a
setAge (a)
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 44
Спеціалізація (обмеження)
class Person {
…
protected:
int age;
public:
bool setAge(int _age) {
if (_age >=0 && _age <= 125) {
age = _age;
return true;
}
return false;
}
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 45
Спеціалізація (обмеження)
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 46
Далі буде… ☺
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 47