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

1 ... 65 66 67 [ 68 ] 69 70 71 ... 227


210 .

Самаучитель С+

Класс наследуется как закрытый i.i, р-Гч-!! J.

class derived: private base { int у;

public: .;> i ..J

void setydnt n) { у = n; } void showy 0 { cout у Nn; }

int raain()

derived ob;

ob.setxtlO); ОБКА - теперь закрыто для производного класса ob.sety(20); правильный доступ к член одного класса

ob.showx(); ob, showy ();

return 0;

ОБКА - теперь закрыто для производного класса правильный доступ к члену производного класса

Как отражено в комментариях к этой (неправильной) программе, функции showx() и setx() становятся закрытыми в производном классе и недоступными вне его.

Запомните, что функции showx() и setx() в базовом классе base по-прежнему остаются открытыми независимо от того, как они наследуются производным классом. Это означает, что объект типа base мог бы получить доступ к этим функциям в любом месте программы. Однако для объектов типа derived они становятся закрытыми. Например, в данном фрагменте:

base base ob;

base ob.setx(l)

правильно, поскольку объект base ob имее тип base

вызов функции setx( илен, поскольку функция setx() - это открытый член класса base,

4. Как мы уже узнали, хотя открытые члены базового класса при наследовании с использованием спецификатора private в производном классе становятся закрытыми, внутри производного класса они остаются доступными. Например, ниже представлена исправленная версия предыдущей программы:

Исправленная версия программы ttinclude <iostreain> using namespace std;

class base (

int X; .

public: ..

voi (int n) { x = n; }



:c;ZS.


1. Исследуйте следующую конструкцию:

ttinclude <iostream>

using namespace std;

class mybase { .

in a, b; . .i i ,).--

public:

int c; , .

voi b{int i, in) (a i; b j; } voi b(int Si, inj) { i = a; j = b; }

class derivedl: pablic mybase { . ., . . ; ;

II... ,511 -I с - . 1 ;*-.)

I

voi wx() \n; }

Класс наследуется как закрытый class derived: private base { int у;

public:

переменная setx доступна внутри класса derived void setxy(int n, in m) (n); у = га; } переменная доступна внутри класса derived

void showxyO { showxO; cout <<. у \n; }

int main () . . t.-- /....., u iv.

derived ob; ob.setxydO, 20) ; ob.showxy() ; return 0;

} x..,i...-

В данном случае функции OWX() txQ доступны внутри производного класса, что совершенно правильно, поскольку они являются закрытыми членами этого класса.



Какая из следующих инструкций правильна внутри функции mainO?

ab(i, j) ; , .

B. o2 . getab (i, j ) ;

C. ol.c = 10; o2.c = 10;

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

3. Если вы этого еще не сделали, попытайтесь выполнить все примеры, представленные в этом разделе. Поэкспериментируйте со спецификаторами доступа и изучите результаты.

7.2. Защищенные члены класса

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

к закрытым членам базового. Это означает, что если производному классу необходим доступ к некоторым членам базового, то эти члены должны быть открытыми. Однако возможна ситуация, когда необходимо, чтобы члены базового класса, оставаясь закрытыми, были доступны для производного класса. Для реализации этой идеи в C++ включен спецификатор доступа protected (защищенный).

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

Спецификатор доступа protected может находиться в любом месте объявления класса, хотя обхчно его располагают после объявления закрытхх членов (задаваемых по умолчанию) и перед объявлением открытых членов. Ниже показана полная основная форма объявления класса:

clas ved2: private ase ( - -

...

..V -

int mainO -iq \. :::

\ .

derivedl ol;

detiveai o2; K. - гч . -- дл-Т-г! -*.

int i, j; . t;- .. -и ; -



1 ... 65 66 67 [ 68 ] 69 70 71 ... 227

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