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

33. Доступ к наследуемым членам класса

Сводка доступности элементов

_______________________________________________________

Степ. доступа | Тип наследования |

в эл. баз. кл. | public: | protected: | private: |

~~~~~~~~~~~~~~~|~~~~~~~~~~~~|~~~~~~~~~~~~|~~~~~~~~~~~~|

public: | public: | protected: | private: |

---------------|------------|------------|------------|

protected: | protected: | protected: | private: |

---------------|------------|------------|------------|

private: | private: | не видемый | не видемый |

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Порожденные классы наследуют все элементы образованного класса (данные и функции).

Не наследуются конструкторы, деструкторы, операции присваивания. В порожденном классе можно определить член с таким же именем.

При наследовании классов важную роль играет статус доступа (статус внешней видимости) компонентов. Для любого класса все его компоненты лежат в области его действия. Тем самым любая принадлежащая классу функция может использовать любые компонентные данные и вызывать любые принадлежащие классу функции. Вне класса в общем случае доступны только те его компоненты, которые имеют статус public.

В иерархии классов соглашение относительно доступности компонентов класса следующее:

Собственные (private) методы и данные доступны только внутри того класса, где они определены.

Защищенные (protected) компоненты доступны внутри класса, в котором они определены, и дополнительно доступны во всех производных классах.

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

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

Еще раз отметим, что на доступность компонентов класса влияет не только явное использование спецификаторов доступа (служебных слов) - private (собственный), protected (защищенный), public (общедоступный), но и выбор ключевого слова class, struct, union, с помощью которого объявлен класс.

34. Стандартные преобразования типов при наследовании

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

Объект, порожденный всегда неявно преобразуется к объекту базового класса. Ссылка также преобразуется неявно.Указатель на произвольный класс преобразуется неявно в указатель на базовый класс.Указатель на член базового класса преобразуется неявно в указатель на член производного класса.

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

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

Пример:

class A

{ public:

void f1();

void f2();

}

A *pa;

BB *pb;

B x; // x-объект класса B

pa=&x; // неявно преобраз.

pa->f1(); // вызв. функция базового класса

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

pb=(B*) pa;

pb->f1(); // B::f1();

pb->f2();

Аппарат наследования классов предусматривает возможности преобразования типов между суперклассом и подклассом. Преобразование типов в каком-то смысле является формальным. Сам объект при таком преобразовании не изменяется, преобразование относится только к типу ссылки на объект .

Рассмотрим это на примере.

Пример

class A {

int x;

. . .

}

class B extends A {

int y;

. . .}

B b = new B();

A a = b; // здесь происходит формальное преобразование типа: B => A

Различаются два вида преобразований типов — upcasting и downcasting . Повышающее преобразование (upcasting) — это преобразование от типа порожденного класса (от подкласса) к базовому (суперклассу). Такое преобразование допустимо всегда. На него нет никаких ограничений и для его проведения не требуется применять никаких дополнительных синтаксических конструкций (см. предыдущий пример). Это связано с тем, что объект подкласса всегда в себе содержит как свою часть объект суперкласса.

Понижающее преобразование (downcasting) — это преобразование от суперкласса к подклассу.

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