Professional Documents
Culture Documents
6 Конструктори та деструктори, розподіл памяті при спадкуванні
6 Конструктори та деструктори, розподіл памяті при спадкуванні
програмування
Максим Михайлович Древаль
m.dreval@kpi.ua
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 1
У попередній серії…
➢ Дружні функції
➢ Дружні класи
➢ Спадкування в C++
Об’єктно-орієнтоване програмування (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 ініціалізує
... анонімний об’єкт
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 5
Конструктори
class Parent {
public:
Parent() {
cout << “Parent 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) {…};
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 9
Явна ініціалізація
class Parent {
public:
Parent() { cout << “Parent Constructor” << endl; }
…
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 10
Явна ініціалізація
➢ Розробник може використовувати ініціалізатор базового класу та список
ініціалізації полів об’єкта одночасно
class Parent {
public:
Parent () {…}
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 12
Ініціалізація полів
class Person {
public:
int age;
char *name;
…
public:
Person();
};
Об’єктно-орієнтоване програмування (2020/21) М.М. Древаль / ІПСА НТУУ «КПІ ім. І.Сікорського» // m.dreval@kpi.ua 13
Деструктори
class Parent {
public:
Parent() { cout << “Parent Constructor” << endl;}
~Parent() { cout << “Parent 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();
…
};
Об’єктно-орієнтоване програмування (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;
}
Об’єктно-орієнтоване програмування (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