Программирование >>  Расширенная версия языка c++ 

1 ... 67 68 69 [ 70 ] 71 72 73 ... 227


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

2. Объясните, зачем нужна категория защищенности protected?

3. В вопросе 1 из раздела 7.1, если бы переменные а и b внутри класса myclass стали не закрытыми (по умолчанию), а защищенными членами, изменился бы какой-нибудь из ваших ответов на вопросы этого упражнения? Если да, то почему?

7.3 укторы, деструкторы и наследование

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

Если у базового и у производного классов имеются конструкторы и деструкторы, то конструкторы выполняются в порядке наследования, а деструкторы - в обратном порядке. Таким образом, конструктор базового класса выполняется раньше конструктора производного класса. Для деструкторов правилен обратный порядок: деструктор производного класса выполняется раньше деструктора базового класса.

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

С другой стороны, деструктор производного класса должен выполняться раньше деструктора базового класса потому, что базовый класс лежит в основе производного. Если бы деструктор базового класса выполнялся первым, это бы разрушило производный класс. Таким образом, деструктор производного класса должен вызываться до того, как объект прекратит свое существование.

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

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

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



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

жонс:грук;гор лроиэв класса Ссписож-арг, бааош класс (С11ксок лрг) { а-ело конструктора производного класса

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

flptlMSpM

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

♦ include <iostream> . . , ...

using namespace std; .

class base {

public:

baseO { cou Работа конструктора то классаХп ; } ~ba.se О { cou Работа деструктора то класса\п ; }

class derived: public base ( public:

derived() ( cou< Работа конструктора производного a\n ; } -derivedо ( cout Работа деструктора производного классаЧп ; }

int main ()

derived о;

return 0; :ч.>,. С.-.

После выполнения программы на экран выводится следующее: -

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

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

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



218 -. Самоучитель С++

2. В этой программе показана передача аргумента конструктору производного класса:

finclude <:iostream> . .

using namespace std; ... . .,. , .

class base { . л* t-ii-i . >:

public:

baseO { cou Работа конструктора базового a\n ; } ~base() { cou << Работа деструктора то класса\п ; }

>;

class derived: public base {

intj; ,

public: ; .. ,

n) {

cou << Работа конструктора производного класса\n ; j = n; . .

~derived{) { cout Работа деструктора производного класса\п ; } voidshowjO { cout j \n; }

int mainO

derivedo (10) г

о. showj {);

return 0;

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

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

ttinclude <iostreain>

usin espace std; . ...

class base { ,

int i;

public: I .

base (int n) {

cou Работа конструктора базового классаХп ; i - n;



1 ... 67 68 69 [ 70 ] 71 72 73 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика