- •2. Появление ооп: необходимость в трансформируемых типах данных.
- •3. Появление ооп: необходимость обеспечения распределения вычислений в пространстве и во времени. Основные идеи ооп.
- •Классы объектов
- •Инкапсуляция атрибутов и методов класса
- •Системы классов: агрегация и композиция
- •Создание объектов и задание их начальных состояний
- •27. Создание объектов класса, использующих объекты других классов в качестве членов-данных
- •Возможности прямого доступа к членам базового класса, обусловленных только размещение в секциях базового класса и вложением видимости.
- •На возможности прямого доступа к членам базового класса существенное влияние оказывают спецификаторы доступа.
- •Трансформация секций базового класса, обусловленная видом наследования.
- •Виды сценариев наследования
- •43. Сравнение видов полиморфизма
Возможности прямого доступа к членам базового класса, обусловленных только размещение в секциях базового класса и вложением видимости.
Размещение чл. в секциях базового класса
Вид клиента |
Открытая секция |
Защищенная секция |
Закрытая секция |
Функции-члены базового класса |
имеют |
имеют |
имеют |
Функции-члены производного класса |
имеют |
имеют |
не имеют |
Функции вне базового и вне производного классов |
имеют |
не имеют |
не имеют |
-
На возможности прямого доступа к членам базового класса существенное влияние оказывают спецификаторы доступа.
Трансформация секций базового класса, обусловленная видом наследования.
Размещение чл. в секциях базового класса
Спецификатор наследования |
Открытая секция |
Защищенная секция |
Закрытая секция |
Открытое наследование |
открытая |
защищенное |
нет доступа |
Защищенное наследование |
защищенное |
защищенное |
нет доступа |
Закрытое наследование |
закрытое |
закрытое |
нет доступа |
-
С++ при наличии возможности доступа к членам базового класса и сокрытие его имени членами производного класса позволяет открыть доступ к этому члену с использованием квалификационного имени.
Пример.
void Square:: MoveToPoint(Point Q)
{
Point::MoveToPoint(Q);
}
-
Закрытые члены базового класса не обеспечивают прямой доступ со стороны функций производного класса.
-
Спецификатор наследования public сохраняет статус в производном классе членов открытых и защищенных секций базового класса.
-
Пользователь производного класса может использовать вызов открытые члены базового класса обращаться к объектам производного класса. Производный класс, рассматриваемый как тип, является почти подтипом типа базового класса.
Тип является подтипом некоторого типа тогда и только тогда, когда объекты подтипа являются объектами типа.
В С++ указатель или ссылка на объект производного класса м.б. автоматически преобразован в указатель или ссылку базового класса. Автоматически – без прямых действий программиста по контексту использования.
Открытое наследование реализует правило подстановки на уровне указателей или ссылок.
-
Открытое наследование является наиболее частым и широко используемым, потому что требует для своего использования знания меньшего количества деталей.
Защищенное и закрытое наследование требуют большей квалификации программиста.
Открытое наследование более соответствует модели ООП.
-
Защищенное наследование переводит открытые и защищенные секции базового класса в защищенные секции производного класса, тем обеспечивая прямой доступ таких секций базового класса со стороны наследников, закрывая прямой доступ пользователям производного класса.
-
Закрытое наследование переводит открытые и защищенные секции базового класса в закрытые секции производного класса. Такое наследование оставляет прямой доступ членам производного класса и закрывает его для пользователей и наследников производного класса.
-
Защищенное и закрытое наследование делает недействительным отношение подстановки объекта производного класса вместо объекта базового класса.
-
Уровень доступа к члену базового класса со стороны производного класса м.б. восстановлен до уровня, установленного в базовом классе.
class Point
{
Int x; int y;
public:
MoveToPoint(Point Q);
// эта функция будет нужна в производном классе, а остальные не нужны
}
class Square: private Point
{
unsigned int w;
public:
Point:: MoveToPoint;
}
Задание 17.
Теоретически и практически ответить на вопрос: если базовый класс имеет несколько функций с одним именем, о сколько восстановлений уровня доступа нужно написать? А если функции находятся в различных секциях базового класса?
Восстановление уровня доступа, измененного спецификатором наследования, осуществляется размещением квалификационного имени функции в секции доступа производного класса, совпадающей с секцией базового класса.
-
Уровень доступа, измененный спецификатором наследования, м.б. восстановлен, но не изменен.
34. Реализация сценариев наследования в классах языка С++.
-
Наследование предназначено для создания нового класса на основе существующих, т.о. наследование является средством повторного использования.
-
В концептуальной модели ООП в класс наследник передаются все атрибуты и все методы класса родителя. А так же м.б. добавлены в класс наследник свои методы и атрибуты. В С++ имеются большие возможности для создания нового класса путем наследования.
-
В большинстве случаев новые классы создаются путем специализации существующих.
-
При создании новых классов с помощью наследования м.б. использованы и практически используются два подхода.
-
Первый подход состоит в том, что базовый класс используется только для создания нового производного класса, при это использование фрагментов программы, которые были рассчитаны на использование объектов базового класса во внимание не принимаются.
-
Второй: производный класс создается на основе базового класса и при этом стремимся использовать фрагменты программы созданной для объектов базового класса для объектов производного класса.
-
При построении производного класса на С++ можно управлять:
-
Набором используемых членов базового класса
-
Переопределением функций базового класса
-
Доступом к членам базового класса.
Сценарием наследования называется набор способов, которыми в производном классе управляется доступ к членам базового класса.
Обобщенные сценарии могут строиться с учетом:
-
Комбинации значений количества членов, количества переопределенных функций, количества используемых уровней доступа.
№ секции |
Количество членов базового класса используемых в производном классе (все, часть, ни одного) |
Количество переопределенных функций (все, часть, ни одной) |
Количество измененных уровней доступа |
Ссылка на примеры |
Зачем нужна эта таблица, я не знаю. |