You are on page 1of 22

Об’єктно-орієнтоване

програмування
Максим Михайлович Древаль
m.dreval@kpi.ua

Кафедра математичних методів системного аналізу (ММСА)


Інститут прикладного системного аналізу
НТУУ «КПІ ім. І.Сікорського»

Весняний семестр 2020/21


Старт курсу — 06 лютого 2021

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 1
У попередній серії…

➢ Дружні функції

➢ Дружні класи

➢ Спадкування в C++

➢ Базові та похідні класи

➢ Види спадкування в C++: public, protected, private

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 2
Спадкування.
Конструктори та деструктори

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 3
Розподіл пам’яті

➢ Кожен об’єкт похідного класу містить анонімний об'єкт базового класу

base member1
Інформаційні члени
base member2 базового класу
...

derived member1
Інформаційні члени
derived member2 похідного класу
...

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 4
Конструктори
➢ Анонімний об’єкт базового класу ініціалізується за допомогою
конструктора базового класу

➢ При створенні об’єкта похідного класу конструктор базового класу


виконується перед конструктором похідного класу

Конструктор
base member1
базового класу
base member2 ініціалізує
... анонімний об’єкт

derived member1 Конструктор


похідного класу
derived member2 ініціалізує об’єкт
... похідного класу

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 5
Конструктори
class Parent {
public:
Parent() {
cout << “Parent Constructor” << endl;
}
};

class Child : public Parent {


public:
Child() {
cout << “Child Constructor” << endl;
}
};

int main() {
Child cObj;
return 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 6
Конструктори

Результат виконання

Parent Constructor
Child Constructor

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 7
Конструктори
➢ Якщо конструктора за замовчуванням для базового класу не існує, то
компілятор спробує його створити та виконати перед виконанням
конструктора похідного класу

➢ Якщо розробник надав лише перевантажений конструктор для базового


класу, компілятор не ґенерує конструктор за замовчуванням для базового
класу

class Parent {
public:
Parent (int i) {}
};
class Child : public Parent {
public:
Child() {}
} сObj; // Error!

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 8
Явна ініціалізація

➢ С++ забезпечує механізм явного виклику конструктора базового класу з


похідного класу

➢ Синтаксис подібний до ініціалізаторів полів і трактується як явна


ініціалізація об’єкта базового класу

class Parent{
public:
Parent (int i) {…};
};

class Child : public Parent {


public:
Child (int i) : Parent (i) {…}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 9
Явна ініціалізація

class Parent {
public:
Parent() { cout << “Parent Constructor” << endl; }

};

class Child : public Parent{


public:
Child() : Parent() {
cout << “Child Constructor” << endl;}

};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 10
Явна ініціалізація
➢ Розробник може використовувати ініціалізатор базового класу та список
ініціалізації полів об’єкта одночасно

➢ Ініціалізатор базового класу може бути записаний після ініціалізатора


поля похідного класу

➢ Конструктор базового класу виконується перед ініціалізацією полів


похідного класу

class Parent {
public:
Parent () {…}
};

class Child : public Parent {


int member;
public:
Child () : member(0), Parent() {…}
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 11
Ініціалізація полів

➢ Похідний клас може ініціалізувати члени базового класу лише


використовуючи перевантажені конструктори

➢ Похідний клас не може ініціалізувати відкриті члени базового класу за


допомогою списку ініціалізації
➢ Причина: фактично це буде присвоювання, а не ініціалізація

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 12
Ініціалізація полів
class Person {
public:
int age;
char *name;

public:
Person();
};

class Student : public Person {


private:
int semester;

public:
Student (int a) : age(a) // Error!
{ …
}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 13
Деструктори

➢ Деструктори викликаються у зворотному порядку

➢ Деструктор похідного класу викликається перед викликом деструктора


базового класу

class Parent {
public:
Parent() { cout << “Parent Constructor” << endl;}
~Parent() { cout << “Parent Destructor” << endl;}
};

class Child : public Parent {


public:
Child() { cout << “Child Constructor” << endl;}
~Child() { cout << “Child Destructor” << endl;}
};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 14
Деструктори

Результат виконання

Parent Constructor
Child Constructor
Child Destructor
Parent Destructor

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 15
Спадкування.
Вказівники та посилання

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 16
Відношення «is a» / «is a kind of»
➢ Відношення «is a» / «is a kind of» зазвичай моделюються за допомогою
public-спадкування

➢ При цьому похідний об’єкт є різновидом базового об'єкта

class Person {
char * name;
public:
const char * getName();

};

class Student : public Person {


int rollNo;
public:
int getRollNo();

};

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 17
Відношення «is a» / «is a kind of»

int main()
{
Student sObj;
cout << sObj.getName();
cout << sObj.getRollNo();
return 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 18
Відношення «is a» / «is a kind of»
➢ Вказівник на об’єкт базового класу може також вказувати на об'єкт
похідного класу

int main() {
Person *pPtr = 0;
Student s;
pPtr = &s;
cout << pPtr->getName();
return 0;
}
s
pPtr base member1
base member2
...

derived member1
derived member2
...

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 19
Відношення «is a» / «is a kind of»

int main() {
Person *pPtr = 0;
Student s;
pPtr = &s;
cout << pPtr->getRollNo(); // Error!
return 0;
}

➢ Тип, який використовується для оголошення вказівника або посилання,


називається його статичним типом:
➢ статичним типом pPtr є Person
➢ статичним типом s є Student

➢ Виклик pPtr->getRollNo() є некоректним

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 20
Відношення «is a» / «is a kind of»

➢ Можна використовувати посилання на похідний об'єкт там, де потрібне


посилання на базовий об'єкт

int main() {
Person p;
Student s;
Person& refP = s;
cout << refP.getName();
cout << refP.getRollNo(); // Error!
return 0;
}

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 21
Далі буде… ☺

Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 22

You might also like