|
Программирование >> Расширенная версия языка c++
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;- .. -и ; -
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |