Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

2.2. Наследование и полиморфизм 79

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

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

Например, у нас могли быть общий класс, Собака, у которой есть напиток функции и сопение функции. Специализация этого класса к классу Ищейки, вероятно, не потребовала бы, чтобы мы отвергли функцию напитка, поскольку все собаки пьют в значительной степени тот же самый путь. Но это могло потребовать, чтобы мы отвергли функцию сопения, поскольку у Ищейки есть намного более чувствительное обоняние, чем «универсальная» собака. Таким образом класс Ищейки специализирует функции своего базового класса, Собаки.

Расширение

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

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

2.2.3 Примеры наследования в C ++

Чтобы сделать понятие наследования и полиморфизма более конкретным, давайте подставим -

сидр простой пример в C ++. Мы рассматриваем пример нескольких классов, которые печатают числовые прогрессии. Числовая прогрессия - последовательность чисел, где ценность каждого числа зависит от один или больше предыдущих ценностей. Например, арифметическая прогрессия определяет следующее число добавлением фиксированного incre-ment. Геометрическая прогрессия определяет следующее число умножением фиксированной основной стоимостью. В любом случае прогрессия требует способа определить его первую стоимость, и ей нужен способ определить текущую стоимость также.

Арифметическая прогрессия (увеличивают 1), 0, 1, 2, 3, 4, 5... Арифметическая прогрессия (увеличивают 3), 0, 3, 6, 9, 12... Геометрическая прогрессия (базируются 2), 1, 2, 4, 8, 16, 32... Геометрическая прогрессия (базируются 3), 1, 3, 9, 27, 81...

Мы начинаем, определяя класс, Прогрессию, которая объявлена в кодексе frag-ment ниже. Это определяет «универсальных» участников и функции числового progres-Сьона. Определенно, это определяет следующие двух участников переменной длинного целого числа:

во-первых: первая ценность прогрессии

злая собака: текущая стоимость прогрессии

Поскольку мы хотим, чтобы эти переменные были доступны от производных классов, объявляем мы

их, чтобы быть защищенным.

80

Глава 2. Ориентированный на объект дизайн

Мы определяем конструктора, Прогрессию, печь для сжигания отходов производства, ~Progression, и следующего - мычание три членских функции.

firstValue (): Перезагрузите прогрессию к первой стоимости и возвратите его. nextValue (): Шаг прогрессия к следующей стоимости и возвращению это.

printProgression (n): Перезагрузите прогрессию и напечатайте ее первые ценности n.

Прогрессия класса //универсальная прогрессия

общественность:

Прогрессия (длинный f = 0) //конструктор

: первый (f), злая собака (f)

виртуальный ˜Progression (); //печь для сжигания отходов производства

пустота printProgression (интервал n); //печатают первые ценности n

защищенный:

виртуальный длинный firstValue (); //перезагружает виртуальный длинный nextValue (); //прогресс

защищенный:

долго сначала; //сначала оценивают длинную злую собаку; //текущая стоимость

;

Членская функция printProgression общественная и определена ниже.

недействительная Прогрессия:: printProgression (интервал n)

суд <<firstValue ();

для (интервал i = 2; я <= n; я ++)

суд <<'' <<nextValue ();

единое время co <<endl;

//напечатайте ценности n//, печатают первое//, печатают 2 через n

Напротив, членские функции firstValue и nextValue предназначены как утилиты, которые будут только призваны из этого класса или его производных классов. Поэтому мы объявляем, что они защищены. Они определены ниже.

длинная Прогрессия:: firstValue ()

злая собака = сначала;

возвратите злую собаку;

//сброс

длинная Прогрессия:: nextValue ()

возвратитесь ++ злая собака;

//прогресс

Это - наше намерение, что, чтобы произвести различные прогрессии, производные классы отвергнут один или обе из этих функций. Поэтому у нас есть de - clared оба, чтобы быть виртуальными. Поскольку есть виртуальные функции в нашем классе, мы также обеспечили виртуальную печь для сжигания отходов производства, чтобы быть в безопасности. (Вспомните обсуждение vir-tual печи для сжигания отходов производства от Раздела 2.2.1.) В этом пункте печь для сжигания отходов производства ничего не делает, но это могло бы быть отвергнуто производными классами.