Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы.doc
Скачиваний:
110
Добавлен:
01.05.2014
Размер:
583.17 Кб
Скачать

Виды сценариев наследования

Описание сценариев

Реализация сценариев

Прямое использование членов базового класса

Переопределение членов базового класса

Изменение уровней доступа

Виды наследования

Дополнительные конструкции

Ссылки на примеры

Всех/части/не использ.

Всех/части/ не использ.

Да/нет

1

2

3

4

5

6

7

1

Всех

Не использ.

Нет

Открытое

Нет

2

часть

часть

Нет

Открытое

Нет

3

Не использ.

часть

Нет

Открытое

Разрешение областей видимости для членов базового класса

4

Не использ.

часть

да

закрытое

Восстановление уровня доступа для членов базового класса

Задание 18. Дополнить таблицу ситуациями, возникшими в л/р 3 и к/р

35. Создание объектов производного класса и задание их начальных состояний: производный класс не имеет собственных членов-данных.

  1. Производный класс в С++ должен иметь конструктор для создания объектов производного класса.

  2. Конструктор производного класса должен выполнить:

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

  • должен создать члены-данные производного класса и возможно обеспечить их инициализацию.

  1. Для создания подобъектов базового класса в объекте производного класса конструктор производного класса вызывает конструктор базового класса. Конструкторы базовых классов вызывается в порядке перечисления базовых классов в производном классе.

  2. На создание объекта производного класса влияют следующие обстоятельства:

  • структура производного класса

  • свойства конструктора базового класса

  • необходимость инициализации

  1. Таблица

Базовый класс

Производный класс

Ссылки на примеры

Конструкторы

Члены-данные (наличие)

Конструкторы

Количество

Использование конструкторов

Обеспечение инициализации членов

Наличие определенного конструктора

Вид конструктора

Количество

1

2

3

4

5

6

7

8

9

1

1

Предоставляется по умолчанию

Не обеспечивает (не соответствует модели ООП)

Нет членов данных

Синтаксически не требуется

Предоставляется по умолчанию

Минимальное кол-во 1

2

1

Вызывается без параметров, но имеющий параметры

?

Отсутствуют

Синтаксически не требуется

1) можно использовать предоставляемый по умолчанию

2) определяется программистом

Минимальное кол-во 1

3

1

Имеющий параметры, но не допускающий вызов без параметров

Обеспечивает

Отсутствуют

Обязательно

Со списком инициализации подобъектов базового класса

Минимальное кол-во 1

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

Формат конструктора производного класса со списком инициализации.

Имя_произ_класса (список_параметров) : имя_базового_класса (список_выражений)

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

  1. Если в базовом классе имеется конструктор с параметрами, который не может быть вызван без параметров, то конструктор производного класса должен передать необходимые параметры в конструктор базового класса с помощью списка инициализации.

Пример

class Point

{

Int x; int y;

public:

Point (int x0, int y0);

Point (int x0) { x=x0; y=0;}

}

Class SkipPoint: public Point // добавляется функция прыжка

{

public:

SkipToPoint(Point Q);

SkipPoint (int x0; inty0): Point (x0,y0);

}

36. Создание объектов производного класса и задание их начальных состояний: производный класс имеет собственные члены-данные.

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

Базовый класс

Производный класс

Ссылки на примеры

Конструкторы

Члены-данные (наличие)

Конструкторы

Количество

Использование конструкторов

Обеспечение инициализации членов

Наличие определенного конструктора

Вид конструктора

Количество

1

2

3

4

5

6

7

8

9

1

1

Предоставляется по умолчанию

Не обеспечивает (не соответствует модели ООП)

Есть

Синтаксически не требуется

1) можно использовать предоставляемый по умолчанию и не обеспечивает инициализацию собственных членов-данных

2) определяется программистом, может обеспечивать инициализацию членов-данных

Минимальное кол-во 1

2

1

Вызывается без параметров, но имеющий параметры

?

Есть

Синтаксически не требуется

1) можно использовать предоставляемый по умолчанию и не обеспечивает инициализацию собственных членов-данных

2) определяется программистом, может обеспечивать инициализацию членов-данных

Минимальное кол-во 1

3

1

Имеющий параметры, но не допускающий вызов без параметров

Обеспечивает

Есть

Обязательно

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

Минимальное кол-во 1

4

1

Предоставляется по умолчанию

Не обеспечивает (не соответствует модели ООП)

Есть. Имеются константные члены

Обязательно

определяется программистом, обеспечивает инициализацию константных членов-данных списком инициализации

Минимальное кол-во 1

5

1

Вызывается без параметров, но имеющий параметры

?

Есть

Имеются константные члены

Обязательно

определяется программистом, обеспечивает инициализацию константных членов-данных списком инициализации

Минимальное кол-во 1

6

1

Имеющий параметры, но не допускающий вызов без параметров

Обеспечивает

Есть

Имеются константные члены

Обязательно

Со списком инициализации подобъектов базового класса, и списком инициализации собственных константных членов

Минимальное кол-во 1

37. Назначение виртуальных функций.

Пример

/* Объявление массива указателей на объекты класса Point*/

const unsigned int Nmax=10;

Point *Nabor[Nmax];

unsigned int N; // фактическое количество элементов в массиве

/* заполнение массива указателями на объекты класса Point*/

/* Вывод имен классов, к которым принадлежат объекты на которые указывают элементы массива*/

for (unsigned int i=0; i<N; i++)

{Nabor [i]-> display_name();}

/* удаление объектов, заданных в Наборе*/

1. Если наследование открытое, а программа написана в терминах указателей, то массив можно заполнить и объектами класса Point и объектами класса Square.

Определение и основные свойства виртуальных функций.

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

В С++ выбор осуществляется на основании класса объекта, на который показывает указатель или для которого имеется ссылка.

  1. Замена виртуальной функции конкретной функцией осуществляется во время использования программы.

  2. Свойством виртуальной функции является то, что смысл распределен по уровням иерархии.

38. Задание виртуальных функций.

  1. Какая функция м.б. виртуальной? Виртуальной функцией м.б. только функция член-класса.

  2. Для задания виртуальной функции, ее объявление (определение) должно быть снабжено служебным словом virtual.

  3. Служебное слово используется только в определении или в объявлении функции.

Пример.

class Point

{

int x; int y;

public:

virtual void display_name() const

{

cout<<endl<<" Point "<<endl;

}

}

  1. Объявление функции как виртуальной, приводит к тому, что она является виртуальной на всех последующих уровнях иерархии, если там нет ее определения.

Пример.

class Square: public Point;

{

unsignedint w;

public:

// здесь имеет смысл функция display_name и эта функция виртуальная

}

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

Пример.

virtual void display_name ()

{

cout<<endl<<" Square "<<endl;

}

// здесь имеет смысл имя display_name, но эта функция переопределена

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

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

Если virtual не используется, то функция не является виртуальной для последующих классов.

Если virtual используется, то эта функция сама является виртуальной для классов уровня иерархии ниже.

  1. С учетом 5 и 6 одна и та же функция м.б. объявлена виртуальной и в базовом классе и в производном классе.

  2. Функция м.б. виртуальной в базовом классе и может не предполагаться ее использование объектами этого класса.

Пример.

class Figure

{

public:

virtual unsignedint Area() = 0;

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

}

Новая конструкция - чисто виртуальная функция.

  1. С++ позволяет определить в классе чисто-виртуальную функцию – функция для которой указатель объявление, инициализированное нулем. Это синтаксический сигнал – функция чисто-виртуальная. Класс, который имеет чисто-виртуальную функцию, не может иметь объектов. Она нужна для выражения концепции.

  2. Если в базовом классе определена чисто-виртуальная функция, а в производном классе такая функция (с таким именем) не определена, то производный класс имеет чисто виртуальную функцию и не может иметь объектов. Классы, имеющие чисто-виртуальную функцию, называются абстрактами.

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

  4. В производный класс м.б. добавлены свои виртуальные функции не совпадающие с виртуальными функциями базового класса.

  5. Деструкторы производного класса обязаны быть виртуальными.

  6. Конструкторы не могут быть виртуальными.

39. Вызов виртуальных функций. Виртуальные деструкторы.

Вызов виртуальных функций.

  1. Виртуальная функция является особой функцией-членом класса, т.к. она м.б. вызвана с сохранением своих свойств только с помощью указателя или ссылки.

  2. Виртуальная функция которая будет вызвана с помощью оператора селекции, но при этом она теряет свойства переопределения.

  3. Конкретная функция которая будет вызвана при использовании указателя на базовый класс будет определена классом того объекта на который указывает указатель.

  4. Набор потенциальных виртуальных функций которые можно вызвать с помощью указателя или ссылки на базовый класс состоит:

  • функция, которая определена в классе, где впервые этой функции дан смысл виртуальной;

  • это функции классов, принадлежащим иерархии, является производной тех классов, где эта функция впервые объявлена виртуальной.

Виртуальные деструкторы.

  1. Для нормального удаления объектов производного класса деструкторы базового класса должен быть виртуальным.

Пример:

/* Разрушение объектов, на которые показывают указатели в массиве*/

for (i=0; i<N; i++)

{delete Nabor[i];}

Язык С++ позволяет сделать деструктор виртуальным.

  1. Программист для корректного удаления объектов базового и производного классов должен сделать деструктор базового класса виртуальным. Он должен явно определить деструктор и сделать его виртуальным.

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

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

  4. Если в классе есть хотя бы одна виртуальная функция, то в этом классе должен быть определен виртуальный деструктор.

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

40. Понятие полиморфизма в концептуальной модели ООП

Полиморфизм – наделение одного имени разными свойствами.

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

  2. Полиморфизм реализуется с помощью двух сущностей:

  • полиморфный объект;

  • полиморфная функция.

Полиморфный объект – объект, который может принимать значения разных классов.

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

  1. В модели ООП 4 вида полиморфизма

  • "чистый";

  • включения;

  • параметрический;

  • специализации.

41. Виды полиморфизма: чистый и включения. Реализация в языке С++

Чистый –

- аргумент – полиморфный объект

- полиморфная функция.

Реализован в Smalltalk

Чистый полиморфизм заключается в том, что существует одна полиморфная функция, в качестве параметра которой передаётся полиморфный объект. Полиморфный объект должен принадлежать определённому множеству классов, имеющих определённые функции. В С++ полиморфизм в чистом виде не реализован.

Включения –

- аргументы – объекты класса, образованные иерархией наследования;

- виртуальная функция.

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

42. Виды полиморфизма: параметрический и специализации. Реализация в языке С++

Параметрический –

- объект - обобщенный тип, который указ. в классе на кажд. функц. ;

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

Параметрический полиморфизм заключается в том, что полиморфная функция имеет класс обрабатываемых объектов в качестве аргумента. Тело функции при этом разрабатывается для неопределённого класса, который впоследствии может быть конкретизирован реальным классом из набора классов, реализующих обобщённые операции. Вызов такой функции непременно сопровождается конкретизацией неопределённого класса. В С++ реализовано шаблонами. Шаблоны, как известно, могут быть шаблонами классов и шаблонами функций.

Специализации –

- параметрическая функция реализующая набор функций;

- объект – набор аргументов.

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