Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пиппец 2.doc
Скачиваний:
107
Добавлен:
07.06.2015
Размер:
3.16 Mб
Скачать

70. Наследование в яп

Наследование —это механизм, позволяющий строить иерархию типов. Механизм наследования предполагает определение базового типа, а затем использование этого типа для построения производных типов. Используя наследование, можно создать главный класс, который определяет свойства, общие для набора связанных элементов. Затем этот класс может быть унаследован другими, более специфическими классами, каждый из которых добавляет те свойства, которые являются уникальными для него. Класс, который унаследован, называется суперклассом (superclass). Класс, который выполняет наследование, называется подклассом (subclass). Поэтому подкласс — это специализированная версия суперкласса. Он наследует все переменные экземпляра и методы, определенные суперклассом, и прибавляет свои собственные уникальные элементы.

Определение производного класса

Синтаксис определения производного класса следующий:

class < D > : [ < вид наследования> ] < В > [, ...] { <объявления членов класса>}

где D - имя производного класса, В - имя базового класса, вид наследования определяется одним из ключевых слов public, private или protected.

Синтаксис определения производного класса напоминает обычное объявление класса, за исключением того, что в заголовке определяемого класса указывается список наследования:

: [ < вид наследования> ]< В >[,...]

Список наследования определяет класс или классы, из которых порождается производный класс. Например:

class Derived : public Base {…};

Здесь определяется производный класс Derived из базового класса Base. При этом класс Derived наследует все свойства класса Base. Количество базовых классов в списке наследования может быть любым. Если производный класс наследует члены более чем одного базового класса, то такое наследование называется множественным. Каждый базовый класс, заданный в списке наследования, к моменту определения производного класса должен быть определен либо для него должно быть задано предварительное объявление. Предварительное объявление класса имеет вид:

class <имя класса>; Например:

class Base; //Предварительное объявление class Derived : public Base

{ . . .};

class Base {...}; //Определение базового класса

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

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

В ранних версиях языка C++ существовали только два атрибута, регулирующих уровень доступа к членам класса - public и private. В процессе все более широкого применения C++ для решения самых разнообразных задач выяснилось, что только этих двух атрибутов недостаточно, причем подавляющее большинство проблем, связанных с недостаточной гибкостью системы контроля доступа, выявились при использовании производных классов.

Например, ни пользователь класса Derived, ни даже функции-члены этого класса не могут получить доступ к членам класса Base, объявленным в нем в части private, хотя эти члены и являются одновременно членами класса Derived на правах наследования. Вначале это может показаться странным, но если подумать, то становится очевидным, что если разрешить функциям-членам производного класса обращаться к личным членам его базового класса, то вся система защиты данных теряет всякий смысл. Для решения такого рода проблем в язык C++ (начиная с версии 2.0) был добавлен еще один атрибут - protected.

Если класс А не служит базовым ни для какого другого класса, то его защищенные (protected) члены ничем не отличаются от личных (private) - доступ к ним имеют только функции-члены данного класса или привилегированные в этом класса функции. Если же класс В является производным от А, то пользователи как класса А, так и В, по-прежнему не имеют доступа к защищенным членам А, но такой доступ имеют функции-члены класса В (и, разумеется, функции, привилегированные в классе В). Еще раз подчеркнем: механизм наследования не может обеспечить доступ к личным членам базового класса. К личным (private) членам любого класса имеют доступ только функции-члены данного класса или функции, привилегированные в этом классе.

Это означает; что уровень доступа к членам класса Base для функций-членов класса Derived и просто пользователей класса Derived остался неизменным: личные члены класса Base недоступны в классе Derived, общие и защищенные члены класса Base остались соответственно общими и защищенными и в классе Derived.

Если базовый класс является личным (private) базовым классом для производного класса:

class Derived : private Base {/* . . . */};

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

Если базовый класс является защищенным (protected) базовым классом для производного класса:

class Derived : protected Base {/* . . . */};

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

Наследование

Доступ в базовом классе

Доступ в производном классе

public:

private

нет доступа

protected

protected

public

public

protected:

private

нет доступа

protected

protected

public

protected

private:

private

нет доступа

protected

private

public

private

м71. Полиморфизм в ЯП

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