Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Когда выполняются функции конструктора и деструктора




 

Поскольку и базовый класс, и производный класс могут содержать конструкторы и деструкторы, важно понимать, в каком порядке они выполняются. Конкретно, в каком порядке вызываются конструкторы, когда начинает существовать объект производного класса? А когда объект перестает существовать, в каком порядке вызываются деструкторы? Для того, чтобы ответить на эти вопросы, начнем с такой простой программы:

 

// Демонстация порядка выполнения работы конструкторов и леструкторов

//при наследовании

 

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

 

class B{

public:

B() { cout << "Constructor of base clacc \n"; }

~B () { cout << "Destructor of base clacc \n"; }

};

 

class D: public B {

public:

D() { cout << "Constructor of derived clacc \n"; }

~D () { cout << "Destructor of derived clacc \n"; }

};

 

int main () {

{ D ob;

// не делаем ничего, только конструируем и уничтожаем ob}

} _getch();

return 0;

}

 

Как указано в комментарии к функции main(), эта программа просто конструирует и уничтожает объект с именем ob, принадлежащий классу D. Если программу запустить, она выведет на экран следующее:

 

 

Как показывает этот вывод, сначала выполняется конструктор В, затем конструктор D. Далее (поскольку ob в этой программе немедленно уничтожается) вызывается деструктор D, а вслед за ним деструктор В.

Результаты проведенного эксперимента можно обобщить следующим образом. Когда создается объект производного класса, сначала вызывается конструктор базового класса, затем конструктор производного класса. Когда объект производного класса уничтожается, сначала вызывается его деструктор, затем деструктор базового класса. Другими словами, конструкторы выполняются в порядке наследования их классов. Деструкторы выполняются в порядке, обратном порядку наследования их классов.

В случае многоуровневой иерархии классов (т. е. когда производный класс выступает в качестве базового класса для другого производного класса), используется то же общее правило: конструкторы вызываются в порядке наследования их классов; деструкторы вызываются в обратном порядке. Если конструктор наследует более чем от одного класса одновременно, конструкторы вызываются в порядке их перечисления (слева направо) в списке базовых конструкторов производного класса. Деструкторы вызываются в обратном порядке, справа налево.

 

Вопросы

 

1. Каким образом указывается, что данный класс является производным от базового?

2. Включает ли в себя производный класс члены базового класса?

3. Имеет ли производный класс доступ к закрытым членам своего базового класса?

4. Если базовый класс наследуется как закрытый, открытые члены базового класса становятся закрытыми членами производного класса. Правильно ли это?

5. Можно ли сделать закрытый член базового класса открытым посредством наследования?

6. Чтобы сделать член доступным внутри иерархии, но закрытым в любом другом месте, какой описатель доступа следует использовать?

7. Каким образом производный класс активизирует выполнение конструктора своего базового класса?

8. Можно ли передать параметры конструктору базового класса?

9. Какой конструктор отвечает за инициализацию той части объекта производного класса, которая относится к базовому классу? Конструктор базового класса или производного класса?

10. Можно ли использовать производный класс в качестве базового для другого производного класса?

11. В каком порядке вызываются конструкторы в иерархии классов?

12. В каком порядке вызываются деструкторы в иерархии классов?

 

Упражнения

 

1. Используя следующую иерархию классов, создайте конструктор класса С так, чтобы он инициализировал переменную к и передавал аргументы конструкторам А() и В().

 

#include <iostream>

#include <conio>

using namespace std;

 

class A {

int i;

public:

A(int a) { i = a; }

};

class B{

int j;

public:

B(int a) { j = a; }

};

class C: public A, public B {

int k;

public:

/* Создайте такой конструктор C(), чтобы он инициализировал переменную к

и передавал аргументы конструкторам А() и В() */

};

 

2. Создайте исходный базовый класс building для хранения числа этажей и комнат в здании, а также общую площадь комнат. Создайте производный класс house, который наследует класс building и хранит число ванных комнат и число спален. Кроме этого создайте производный класс office, который наследует класс building и хранит число огнетушителей и телефонов.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...