Объектно-ориентированное программирование на C++


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


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

Если и у базового и у производного классов есть конструкторы и деструкторы, то конструкторы выполняются в порядке наследования, а деструкторы - в обратном порядке. Т.е. если А базовый класс, В - производный из А, а С - производный из В (А-В-С), то при создании объекта класса С вызов конструкторов будет иметь следующий порядок: конструктор А - конструктор В - конструктор С. Вызов деструкторов при разрушении этого объекта произойдет в обратном порядке: деструктор С - деструктор В - деструктор А.

Понять закономерность такого порядка не сложно, поскольку базовый класс "не знает" о существовании производного класса, любая инициализация выполняется в нем независимо от производного класса, и, возможно, становится основой для инициализации, выполняемой в производном классе. С другой стороны, поскольку базовый класс лежит в основе производного, вызов деструктора базового класса раньше деструктора производного класса привел бы к преждевременному разрушению производного класса.

class BaseClass

{

public:

 BaseClass() {cout << ' Работа конструктора базового класса \n';}

 ~BaseClass() {cout << ' Работа деструктора базового класса \n';}

};

class DerivedClass: public BaseClass

{

public:

 DerivedClass() {cout << ' Работа конструктора производного класса \n';}

 ~DerivedClass() {cout << ' Работа деструктора производного класса \n';}

};

main()

{

 DerivedClass obj;

}

Эта программа выводит следующее

Работа конструктора базового класса



Работа конструктора производного класса

Работа деструктора производного класса

Работа деструктора базового класса

Мы уже говорили о том, что конструкторы могут иметь параметры. При реализации наследования допускается передача параметров для конструкторов производного и базового класса. Если параметрами обладает только конструктор производного класса, то аргументы передаются обычным способом. Однако при необходимости передать аргумент конструктору родительского класса, требуется несколько большее усилие. Прежде всего, нужно позаботится о том, чтобы передать из конструктора производного класса конструктору базового класса. Для этого используется расширенная запись конструктора производного класса.



Содержание раздела