Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
11
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Производные классы и их конструкторы и деструкторы

Базовый и производные классы могут иметь конструкторы и деструкторы. Рассмотрим, в каком порядке вызываются эти функции. Этот вопрос возникает и при множественном наследовании.

Пример:

#include <iostream.h>

class Base{

public:

Base () { cout<<”\n Конструктор класса Base \n”;}

~Base () { cout<<”\n Деструктор класса Base \n”;}

};

class Derive1:public Base{

public:

Derive1 () { cout<<”\n Конструктор производного класса Derive1 \n”;}

~Derive1 () { cout<<”\n Деструктор производного класса Derive1 \n”;}

};

class Derive2:public Derive1{

public:

Derive2 () { cout<<”\n Конструктор производного класса Derive2 \n”;}

~Derive2 () { cout<<”\n Деструктор производного класса Derive2 \n”;}

};

Void main()

{

Derive1 d1;

cout<<”\n”;

Derive2 d2;

cout<<”\n”;

}

В программе создаются объекты типа Derive1 и Derive2, при этом выполняются конструкторы и деструкторы в следующей последовательности.

На экране:

Конструктор класса Base

Конструктор производного класса Derive1

Конструктор класса Base

Конструктор производного класса Derive1

Конструктор производного класса Derive2

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

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

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

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

В С++ разрешено при создании производного класса пользоваться несколькими базовыми классами. При объявлении производного класса базовые классы перечисляются через запятую. При создании объекта конструкторы выполняются в порядке следования базовых классов слева направо.

Пример:

#include <iostream.h>

class Base1{

public:

Base1() { cout<<”\n Конструктор класса Base1 \n”;}

~Base1 () { cout<<”\n Деструктор класса Base1 \n”;}

};

class Base2{

public:

Base2() { cout<<”\n Конструктор класса Base2 \n”;}

~Base2 () { cout<<”\n Деструктор класса Base2 \n”;}

};

class Derive:public Base1, public Base2{

public:

Derive () { cout<<”\n Конструктор производного класса Derive \n”;}

~Derive () { cout<<”\n Деструктор производного класса Derive\n”;}

};

Void main()

{

Base1 b1;

cout<<”\n”;

Base1 b2;

cout<<”\n”;

Derive d;

cout<<”\n”;

}

Деструкторы выполняются в порядке, обратном по отношению к конструкторам.

Виртуальные базовые классы.

При множественном наследовании базовый класс не может быть задан в производном классе более одного раза:

class Derive:Base, Base {…}; // ошибка

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

class X:public Base{…};

class Y:public Base{…};

class Derive:public X, public Y{…};

Этот пример соответствует схеме наследования, когда каждый объект класса Derive будет иметь два подобъекта класса Base. Чтобы избежать неоднозначности при обращении к членам базового объекта Base, можно объявить этот базовый класс виртуальным. Для этого используется то же зарезервированное слово virtual, что и при объявлении виртуальных функций.

class X:virtual public Base{…};

class Y:virtual public Base{…};

class Derive:public X, public Y{…};

Теперь класс Derive имеет только один подобъект класса Base.