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

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;

};

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