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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



 

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

 

Кратко вид доступа в типе-наследнике для членов базового типа можно представить таблицей:

 

Квалификатор      
доступа      
Область public protected private
доступа      
базового типа      
public public protected private
protected protected protected private
private private private private

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

 

Если не указан тип наследования, то тип наследования по умолчанию оп-ределяется описанием типа наследника. Если тип-наследник описывается клас-сом, то тип наследования – закрытый (private), если же это структура, то на-следование по умолчанию будет открытым (public).

 

Пример:

 

struct A { int x;

 

};

 

class C: A {}; int main(){

 

C c;

 

// c.x = 1; // ошибка: в классе C из-за закрытого по

 

// умолчанию наследования поле x

 

// становится закрытым.

 

return 0;

 

}

 

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

 

 

Пример:

 

class A { public:

int x; private: int y;

 

};

 

struct C: A {};

 

int main(){C c;

 

c.x = 1; // ошибки нет, т.к. наследование – открытое. return 0;

}

 

При необходимости открытого наследования членов базового типа, если тип-наследник описывается с использованием класса, следует явно указывать квалификатор public:

 

class C: public A { int z;

};

 

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

 

Защищенный вид доступа (protected) означает, что члены базового типа в типе-наследнике доступны только для методов своего (базового) типа, а также для методов производного типа. Во всех остальных случаях они ведут себя так же, как члены с закрытым видом доступа (private).

 

Пример:

 

struct A { int x,y;

 

};

 

class B: protected A { int z;

 

public:

 

void putx(int ap) {x = ap;

 

}

 

};

 

 

int main(){B b1; b1.putx(1);

 

...

 

return 0;

 

}

 

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

 

Пусть указатель на объект типа-наследника при защищенном наследовании преобразован к указателю на объекты базового типа. Тогда работа с объектом типа-наследника с использованием указателя на объекты базового типа проис-ходит в соответствии с правами доступа для базового типа (как уже было указано, через такой указатель виден не весь объект типа-наследника, а только его часть, соответствующая базовому типу):

 

struct A {

 

int x; int y;

 

};

 

struct B: A { int z;

 

};

 

class C: protected A { int z;

 

};

 

int main(){A a;

 

A* pa; B b; C c;

C* pc = &c;    
b.x = 1; // ошибка: доступ к закрытому полю  
//pc -> z;  
b.y = 2; // ошибка: доступ к закрытому полю  
//pc -> x;  
b.z = 3;    
pa = (A*)pc; // см. примечание далее.  
a = b; // правильно: поле A::x - открытое  
pa -> x=4;  
return0;    

}

 

Примечание. Так как в данном примере наследование–защищенное,то приприсвоении указателя производного типа указателю базового типа требуется явноепреобразование (pa=(A*)pc;). При открытом наследовании возможно простое присвое-ние указателей (pa=pc). Это связано с тем, что указатель кроме адреса содержит ин-формацию об объекте. При защищенном наследовании изменяется не только состав членов класса, но и права доступа.

 

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

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 509; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.173.227 (0.012 с.)