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

Void main ( )

{

derived obj;

ob.set_x(10);

ob.set_y(12);

ob.show_x( );

ob.show_y( );

}

В данном примере класс base наследуется как открытый. Поэтому в объекте obj, который является экземпляром производного класса, его public- функции доступны как обычные открытые члены. Но “добраться” напрямую до закрытого члена базового класса всё также невозможно; и инструкция типа

cout <<obj.x; // Неверно!

будет ошибкой.

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

# include <iostream.h>

class chief

{ int a;

public:

void set_a (int n) {a=n;}

Int get_a( ) {return a;}

};

class clerk: private chief

{ int b;

public:

void set_ab (int n, int m) {set_a(n);b=m;}

void show_b( ) {cout <<b<<’\n’;}

void show_a( ) {cout <<get a( )<<’\n’;}

};

Void main( )

{clerk.obj;

obj.set_ab(2500,500);

obj.show_b( );

obj.show_a( );

}

Т.к. при наследовании с типом private получить доступ к “наследству” можно только через открытые члены “наследника”, то в классе clerk проектируется функция для ввода значения закрытой переменной “a” базового класса и вторая функция – для вывода этого значения на экран. Однако доступ к “a” возможен только через открытые члены базового класса, которые и выступают в этих функциях в качестве посредников.

  1. Защищенные члены классов.

И

Члены класса

з вышеизложенного все больше проступает неудобство работы с закрытыми членами базового класса в производном классе. Чтобы допустить членов производного класса к общению с private-членами базового класса, введен спецификатор доступа protected (защищенный).

Т

}

закрытые члены

еперь члены класса разделены на три группы: private, protected и public. Спецификатор protected может располагаться в любом месте описания класса, но обычно он располагается перед public . И это оправдано, потому что protected-члены – это часть закрытых членов базового класса, к которым напрямую могут обращаться члены производных классов.

  1. Правила наследования защищенных членов классов

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

1. Когда базовый класс наследуется производным как public, защищенные члены базового класса становятся защищенными членами производного класса.

2 .Когда базовый класс наследуется как закрытый, то защищенные члены базового становятся private-членами производного (аналогично и public-члены).

3.Если базовый класс наследуется как защищенный, то открытые и защищенные члены базового класса наследуются как protected.

#include <iostream.h>

class base

{ int a;

protected:

int b;

public:

void set_ab (int n, int m) {a=n; b=m;}

void show_a( ) {cout<<a<<’ ’;}

};

class derived: protected base

{int c;

public:

void set_c (int k) {c=k;}

void show_bc( ){cout<<b<<’ ‘<<c<<’\n’;}

};

Void main( )

{derived ob;

//ob.set_ab(1,2); //ОШИБКА! set_ab( ) стала закрытым членом derived

ob.set_c(3);

//ob.show_a( ); //ОШИБКА! (аналогичная)

ob.show_bc( )

}

В этом примере базовый класс наследуется как защищенный. В базовом классе недоступной останется переменная «а». Чтобы вывести ее значение предусмотрена public-функция. Члены base при наследовании переходят в категорию protected (кроме «а»), поэтому напрямую недоступны. Из-за этого ошибки в программе.

  1. Технология использования конструкторов в наследовании.

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

а) все аргументы для конструктора базового и конструктора производного классов передаются конструктору производного класса;

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

# include <iostream.h>

class base

{int i;

public:

base(int n) {cout <<”Base constructor”; i=n;}

~base ( ) {cout<<”Base destructor”;}

void show_i( ) {cout <<i<<`\n';}

};

class derived : public base

{ int j;

public:

derived(int n, int m): base(m)

{cout<<”Derived constructor”; j=n;}

~derived( ) {cout<<”Derived destructor”;}

void show_j( ) {cout<<j<<’\n’;}

};

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