- •Закрытое наследование
- •Закрытое наследование
- •Композиция или закрытое наследование?
- •Пример
- •Защищенное наследование
- •Пример
- •Вложенные классы
- •Пример
- •Пример
- •Назначение PIMPL
- •Недостатки PIMPL
- •Реализация PIMPL
- •Пример (ComplexClass.h)
- •Основное преимущество
- •Оператор dynamic_cast
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 1 - указатели
- •Пример 2 - ссылки
- •Пример 2 - ссылки
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;
};