Чтение онлайн

на главную

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

Задание

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

1. Определите класс

B1
с виртуальной функцией
vf
и невиртуальной функцией
f
. Определите эти функции в классе
B1
. Реализуйте каждую функцию так, чтобы она выводила свое имя (например, “
B1::vf
”). Сделайте эти функции открытыми. Создайте объект
B1
и вызовите каждую из функций.

2. Определите класс

D1
,
производный от класса
B1
, и заместите функцию
vf
. Создайте объект класса
D1
и вызовите функции
vf
и
f
из него.

3. Определите ссылку на объект класса

B1
(т.е.
B1&
) и инициализируйте ею только что определенный объект класса
D1
. Вызовите функции
vf
и
f
для этой ссылки.

4. Теперь определите функцию

f
в классе
D1
и повторите пп. 1–3. Объясните результаты.

5. Добавьте в класс

B1
чисто виртуальную функцию
pvf
и попытайтесь повторить пп. 1–4. Объясните результат.

6. Определите класс

D2
, производный от класса
D1
, и заместите в нем функцию
pvf
. Создайте объект класса
D2
и вызовите из него функции
f
,
vf
и
pvf
.

7. Определите класс

B2
с чисто виртуальной функцией
pvf
. Определите класс
D21
с членом типа
string
и функцией-членом, замещающей функцию
pvf
; функция
D21::pvf
должна выводить значение члена типа
string
. Определите класс
D22
, аналогичный классу
D21
, за исключением того, что его член имеет тип
int
. Определите функцию
f
, получающую аргумент типа
B2&
и вызывающую функцию
pvf
из этого аргумента. Вызовите функцию
f
с аргументами класса
D21
и
D22
.

Контрольные вопросы

1. Что такое предметная область?

2. Назовите цели именования.

3. Что такое имя?

4. Какие возможности предоставляет класс

Shape
?

5. Чем абстрактный класс отличается от других классов?

6. Как создать абстрактный класс?

7. Как управлять доступом?

8. Зачем нужен раздел

private
?

9. Что такое виртуальная функция и чем она отличается от невиртуальных функций?

10. Что такое базовый класс?

11. Как объявляется производный класс?

12. Что мы подразумеваем под схемой объекта?

13. Что можно сделать, чтобы класс было легче тестировать?

14. Что такое диаграмма наследования?

15. В чем заключается разница между защищенными и закрытыми членами класса?

16. К каким членам класса имеют доступ члены производного класса?

17. Чем чисто виртуальная функция отличается от других виртуальных функций?

18. Зачем делать функции-члены виртуальными?

19. Зачем делать функции-члены чисто виртуальными?

20. Что такое замещение?

21. Чем наследование интерфейса отличается от наследования реализации?

22. Что такое объектно-ориентированное программирование?

Термины

Упражнения

1.

Определите два класса,
Smiley
и
Frowny
, производные от класса
Circle
и рисующие два глаза и рот. Затем создайте классы, производные от классов
Smiley
и
Frowny
, добавляющие к каждому из них свою шляпу.

2. Попытайтесь скопировать объект класса

Shape
. Что произошло?

3. Определите абстрактный класс и попытайтесь определить объект его типа. Что произошло?

4. Определите класс

Immobile_Circle
, напоминающий класс
Circle
, объекты которого не способны перемещаться.

5. Определите класс

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

6. Определите класс

Striped_circle
, используя приемы из класса
Striped_rectangle
.

7. Определите класс

Striped_closed_polyline
, используя приемы из класса
Striped_rectangle
(для этого придется потрудиться).

8. Определите класс

Octagon
, реализующий правильный восьмиугольник. Напишите тестовую программу, выполняющую все его функции-члены (определенные вами или унаследованные от класса
Shape
).

9. Определите класс

Group
, служащий контейнером объектов класса
Shape
с удобными операциями над членами класса
Group
. Подсказка:
Vector_ref
. Используя класс
Group
, определите класс, рисующий шахматную доску, по которой шашки могут перемещаться под управлением программы.

10. Определите класс

Pseudo_window
, напоминающий класс
Window
. Постарайтесь не прилагать героических усилий. Он должен рисовать закругленные углы, метки и управляющие пиктограммы. Возможно, вы сможете добавить какое-нибудь фиктивное содержание, например изображение. На самом деле с этим изображением ничего не надо делать. Допускается (и даже рекомендуется), чтобы оно появилось в объекте класса
Simple_window
.

11. Определите класс

Binary_tree
, производный от класса
Shape
. Введите параметр, задающий количество уровней (
levels==0
означает, что в дереве нет ни одного узла,
levels==1
означает, что в дереве есть один узел,
levels==2
означает, что дерево состоит из вершины и двух узлов,
levels==3
означает, что дерево состоит из вершины и двух дочерних узлов, которые в свою очередь имеют по два дочерних узла, и т.д.). Пусть узел изображается маленьким кружочком. Соедините узлы линиями (как это принято). P.S. В компьютерных науках деревья изображаются растущими вниз от вершины (забавно, но нелогично, что ее часто называют корнем).

12. Модифицируйте класс

Binary_tree
так, чтобы он рисовал свои узлы с помощью виртуальной функции. Затем выведите из класса
Binary_tree
новый класс, в котором эта виртуальная функция замещается так, что узлы изображаются иначе (например, в виде треугольников).

13. Модифицируйте класс

Binary_tree
так, чтобы он имел параметр (или параметры, указывающие, какой вид линии используется для соединения узлов (например, стрелка, направленная вниз, или красная стрелка, направленная вверх). Заметьте, как в этом и последнем упражнениях используются два альтернативных способа, позволяющих сделать иерархию классов более гибкой и полезной.

Поделиться:
Популярные книги

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Лорд Системы 4

Токсик Саша
4. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 4

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Гарем вне закона 18+

Тесленок Кирилл Геннадьевич
1. Гарем вне закона
Фантастика:
фэнтези
юмористическая фантастика
6.73
рейтинг книги
Гарем вне закона 18+

Возвращение Низвергнутого

Михайлов Дем Алексеевич
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Возвращение Низвергнутого

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену