Class derived:private base

{

...

public: base::void f();

};

Для различных методов класса при использовании механизма наследования существуют разные правила наследования. Конструкторы и операторы присваивания в производном классе не наследуются. Операторы инкрементации и декрементации – наследуются.

Пример 3

Пример простого наследования

 

Class queue

{

protected:

int q[10];

int sloc, rloc;

public:

void init(void);

void qput(init i);

int qget(void);

};

Class queue1:public queue

{

int sum;

public:

int get_sum(void);

void show_sum(void);

};

/* копирование функций-членов класса queue */

Voi queue::init(void)

{

rloc=sloc=0;

}

Int queue::qget(void)

{

if(sloac==rloc)

{

cout<< "очередь пуста";

return 0; /* необходимо вернуть какое-либо значение */

}

return q[rloc++];

}

Void queue::qput(int i)

{

if(sloc==10)

{

cout<< "очередь заполнена";

return;

}

q[sloc++]=i;

}

/* Описание функций - членов класса queue 1*/

Int queue1::get_sum(void)

{

sum=0;

for(int i = rloc; i<sloc; i++)

sum+=q[i];

return sum;

}

Void queue1::show_sum(void)

{

cout<<"Сумма очереди - "<<sum<<endl;

}

Main(void)

{

queue1 obj;

obj.init();

for(int i=0; i<5; i++)

{

obj.qput(100+i);

obj.get_sum();

obj.show_sum();

}

for(i=0; i<6; i++)

{

obj.get_sum();

obj.show_sum();

obj.qget();

}

return 0;

}

 

 


 


Правила наследования различных методов

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

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

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

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

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

4. Не наследуются операция присваивания, следовательно, её требуется явно определить в производном классе

Вызов функции базового класса предполагает копирование фрагментов кода из функций базового класса в функции производного. При этом осуществляется сокращение объектного кода и достигается упрощение модификации программы.

Правила наследования деструктора:

1. Деструкторы не наследуются. Если программист не описал в производном классе деструктор, он формируется по умолчанию и вызывает деструкторы всех базовых классов

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

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

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

Присваивание объектов при наследовании

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

Формат записи операции присваивания выглядит следующим образом:

<объект родительского класса> = <объект производного класса>



Множественное наследование

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

class <имя производного класса>:

<вид наследования> <имя базового класса>

<вид наследования> <имя базового класса>

...

{...};

Вид наследования определяет режим доступа к компонентам каждого из базовых классов. Базовые классы создаются в том порядке, в котором они перечислены в списке базовых классов при объявлении производного класса. Если конструкторы базовых классов не имеют аргументов, то производный класс может не иметь конструктора. При наличии у конструктора базового класса одного или нескольких аргументов, каждый производный класс должен иметь конструктор. Чтобы передать аргумент в базовый класс, нужно определить их после объявления конструктора производного класса.

<имя конструктора производного класса> (<список аргументов>),

<имя конструктора базового класса 1> (<список аргументов>),

...

{<тело конструктора производного класса>}

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

- активируются конструкторы для базовых классов (в порядке их перечисления в объявлении производного класса)

- затем активируется конструктор класса.

Пример 1

Class X

{

protected:

int x;

public:

x(int i); /* конструктор с параметром */

~x(void); /* деструктор */

void put_x(int i) {x=i;}

int get_x(void) {return x;}

void show(void);

};

Class Y

{

protected:

int y;

public:

Y(int i); /* конструктор с параметром */

~Y(void); /* деструктор */

void put_y(int i) {y=i;}

int get_y(void) {return y;}

Void show(void)

};


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: