Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lect09.pdf
Скачиваний:
5
Добавлен:
06.02.2016
Размер:
492.28 Кб
Скачать

9. Открытое,закрытоеи

защищенноенаследование. Преобразованиятипов.

«Объектно-ориентированное программирование»

доцентПриваловМ.В.

Донецк,ДонНТУ,2011

Открытое(публичное) наследование

Открытое(публичное)наследование-

этонаследованиеинтерфейса.

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

Производныйклассслужитпримером отношения"является"(is-a)

class Child : public Parent {};

Открытое(публичное) наследование

Припубличномнаследовании дочернийклассполностьюнаследует интерфейсбазовогокласса.

Собъектамипроизводногокласса можноработатьточнотакже,какис объектамибазовогокласса

Указателииссылкинакласс-потомок всегдабезопасноприводятсяк указателямиссылкамнабазовый класс

Возможныеошибки проектирования

Point

Circle

Cylinder

Неправильныйход мыслей:

«Окружностьможнополучить,добавивкточкерадиус,а цилиндр– добавивкокружностивысоту»

Неправильныйконтекст использованияоткрытого наследования:

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

Класс-наследникдолженпредставлятьсобойчастныйслучай

болееобщей абстракции.

Здесь:

Окружностьнеявляетсячастнымслучаемточки. Цилиндрне являетсячастнымслучаемокружности,и,тем более,точки.

Закрытое наследование

Закрытоенаследование – это наследование

реализации.

Призакрытомнаследованииоткрытыеи защищенныеполяиметодыродительскогокласса становятсязакрытымиполямииметодами производного.

Производныйкласснапрямуюнеподдерживает открытыйинтерфейсбазового,нопользуется его реализацией,предоставляясобственный

открытыйинтерфейс.

Производныйклассслужитпримеромотношения

«реализованнаоснове»(implemented as).

Закрытое наследование

class IntArray

{

public:

int getValue(int index)const; void setValue(int index, int v); int getLength()const;

private:

...

};

class IntStack : private IntArray

{

 

public:

 

void push(int element);

Нельзяиспользоватьоткрытое

int pop();

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

bool isEmpty()const;

• стекнеявляетсямассивом,но

};

пользуетсяреализациеймассива;

• кстекуне применимыоперации индексированногодоступа.

Композиция или закрытое наследование?

Чащевсего вместо того,чтобы использовать закрытоенаследование, предпочтительнее применить композицию

Прикомпозицииновыйклассможет использовать несколькоэкземпляровсуществующего класса

Композицияделает классыменее зависимыми другот друга,чемнаследование

Закрытоенаследованиелучше,если

естьнеобходимостьполучитьдоступк защищеннымметодамсуществующего класса

Пример

class IntArray { public:

int getValue(int index)const; void setValue(int index, int v); int getLength()const;

private:

...

};

class IntStack2 { public:

void push(int element); int pop();

bool isEmpty()const; private:

IntArray m_items;

};

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