Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

8.3. Конструкторы и деструкторы производных классов

Поскольку конструкторы не наследуются, при создании производного класса наследуемые им данные-члены должны инициализироваться конструктором базового класса. Конструктор базового класса вызывается автоматически и выполняется до конструктора производного класса. Если наследуется несколько базовых классов, то их конструкторы выполняются в той последовательности, в которой перечислены базовые классы в определении производного класса. Конструктор производного класса вызывается по окончании работы конструкторов базовых классов. Параметры конструктора базового класса указываются в определении конструктора производного класса. Таким образом, происходит передача аргументов от конструктора производного класса конструктору базового класса.

В С++ существует специальный синтаксис для передачи аргументов конструктора производного класса конструктору базового класса:

заголовок_функции: имя_базового_класса (список аргументов)

Если параметр имя_базового_класса (список аргументов) пропущен, то вызывается конструктор по умолчанию базового класса.

Пример 8.4

class Basis

{

private:

int a, b;

public:

Basis(int x, int y)

{

a = x;

b = y;

}

};

class Inherit : public Basis

{

private:

int sum;

public:

Inherit(int x, int y, int s): Basis (x, y)

{

sum = s;

}

};

Запомните, что конструктор базового класса вызывается автоматически и мы указываем его в определении конструктора производного класса только для передачи ему аргументов.

Объекты класса конструируются снизу вверх: сначала базовый, потом его компоненты-объекты (если они имеются), а потом сам производный класс. Т.о. объект производного класса содержит в качестве подобъекта объект базового класса.

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

Следующий пример иллюстрирует очередность вызовов конструкторов и деструкторов для экземпляра класса PD, который наследуется от класса PublicDerived. Класс PublicDerived, в свою очередь, наследуется от класса Base.

#include <iostream.h>

class Base //родительский класс

{

public:

Base(){cout<<"Base constructor!\n";};

~Base(){cout<<"Base destructor!\n";};

void Func() //public-функция в родительском классе

{cout<<"------Hello from Base\n";}

};

class PublicDerived:public Base //объявление производного public-класса

{

public:

PublicDerived(){cout<<"PublicDerived constructor!\n";};

~PublicDerived(){cout<<"PublicDerived destructor!\n";};

void Func() //public-функция в наследуемом классе

{

Base::Func(); //вызвали функцию родительского класса

cout<<"------Hello from PublicDerived\n"; //добавили собственные изменения

}

};

class PD:public PublicDerived //объявление производного public-класса

{

public:

PD(){cout<<"PD constructor!\n";};

~PD(){cout<<"PD destructor!\n";};

};

void main()

{

PD aPD1; //экземпляр производного класса

aPD1.Func();//вызов метода родителя (PublicDerived)

}

Результатом работы программы будет вывод на экран сообщений:

Base constructor!

PublicDerived constructor!

PD constructor!

------Hello from Base

------Hello from PublicDerived

PD destructor!

PublicDerived destructor!

Base destructor!

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

#include <iostream.h>

class Base //снова содаем базовый класс

{

public:

Base() //конструктор по умолчанию

{cout<<"Base constructor!\n";};

Base(int a) //конструктор - его то и будем вызвать из производного класса

{cout<<"--Base constructor2222!\n";};

~Base(){cout<<"Base destructor!\n";};

};

class PublicDerived:public Base //объявим производный public-класс

{

public:

PublicDerived()

{cout<<"PublicDerived constructor!\n";};

PublicDerived(int a):Base(a)

{cout<<"--PublicDerived constructor222!\n";};

~PublicDerived(){cout<<"PublicDerived destructor!\n";};

};

void main()

{

PublicDerived aPD1(10); //экземпляр производного класса

}

Результат работы программы будет таким:

--Base constructor2222!

--PublicDerived constructor222!

PublicDerived destructor!

Base destructor!

Попробуйте изменить строку

PublicDerived aPD1(10); //экземпляр производного класса

на

PublicDerived aPD1; //экземпляр производного класса

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]