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

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

второй- сначала достигает желаемого результата. Это изменение - reflected оба в доводе «против» -

structor и отвергнутый участник функционируют firstValue. Отвергнутый участник

функционируйте nextValue, копирует текущую стоимость к предыдущей стоимости. Мы должны сохранить старую предыдущую стоимость во временной переменной.

FibonacciProgression::FibonacciProgression (длинный f, длинный s)

: Прогрессия (f), второй (s), предыдущий (второй- сначала)

длинный FibonacciProgression:: firstValue ()

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

предыдущий = второй- сначала;

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

длинный FibonacciProgression:: nextValue ()

долго работайте временно = предыдущий;

предыдущий = злая собака; злая собака + = временный секретарь; возвратите злую собаку;

Объединение классов прогрессии

//сброс

//создайте фиктивный предыдущий

//прогресс

Чтобы визуализировать, как три различных класса прогрессии получены из

универсальный класс Прогрессии, мы даем их диаграмму наследования в рисунке 2.5.

Рисунок 2.5: диаграмма Наследования для Прогрессии класса и ее подклассов.

84

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

Чтобы закончить наш пример, мы определяем главную функцию, показанную в Кодовом Frag-ment 2.1, который выполняет простой тест каждого из этих трех классов. В этом классе переменная прогр - полиморфное множество указателей на Прогрессию класса. Так как каждый из его участников указывает на объект класса ArithProgression, GeomProgression или Fi-bonacciProgression, функции, соответствующие данной прогрессии, призваны в каждом случае. Продукцию показывают в Кодовом Фрагменте 2.2. Заметьте, что у этой программы есть (неважная) утечка памяти, потому что мы никогда не удаляли ассигнованный объект.

Пример, представленный в этой секции, приводит простой пример inheri-tance и полиморфизма в C ++. У класса Прогрессии, его производных классов и программы тестера есть много недостатков, однако, который не мог бы быть im-, опосредствованно очевидным. Одна проблема состоит в том, что геометрические прогрессии и прогрессии Фибоначчи растут быстро, и нет никакого предоставления для обработки неизбежного overflow длинных включенных целых чисел. Например, с тех пор 340> 263, геометрическая прогрессия с основой b = 3 будет overflow целое число 64 бита длиной после 40 повторений. Аналогично, 94-е Число Фибоначчи больше, чем 263; следовательно, прогрессия Фибоначчи будет overflow целое число 64 бита длиной после 94 повторений. Другая проблема состоит в том, что мы можем не позволить произвольные начальные значения для прогрессии Фибоначчи. Например, сделайте нас

позволить прогрессию Фибоначчи, начинающуюся с 0 и-1? Контакт с входными ошибками или

состояние ошибки, которое происходит во время управления C ++ программа, требует что мы

имейте некоторый механизм для обработки их. Мы обсуждаем эту тему позже в Разделе 2.4.

2.2.4 Многократный кастинг наследования и класса

В примерах мы показали до сих пор, подкласс был получен из сингла

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

Многократное и ограниченное наследование

В C ++, нам разрешают получить класс из многих базовых классов, то есть, C ++

позволяет многократное наследование. Хотя многократное наследование может быть полезным, espe-cially в определении интерфейсов, это вводит много сложностей. Например, если оба базовых класса предоставляют членской переменной то же самое имя или членской функции с той же самой декларацией, производный класс должен определить, от которого базового класса участник должен использоваться (который является сложным). Поэтому мы используем единственное наследование почти исключительно.

Мы использовали общественное наследование в наших предыдущих примерах, обозначенных общественностью ключевого слова в определении базового класса. Помните, что частные участники базового класса не доступны в производном классе. Защищенные и общественные члены базового класса становятся защищенными и общественными членами производного класса, соответственно.