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

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

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

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

Как пример, вспомните наш класс Прогрессии и рассмотрите участника func-tion nextValue, который вычисляет следующую стоимость в прогрессии. Значение этой функции четкое для каждого из производных классов: ArithProgression, Геометрия - Прогрессия и FibonacciProgression. Однако в Прогрессии базового класса мы изобрели довольно произвольный неплатеж для функции nextValue. (Возвратитесь и проверьте его. Какую прогрессию это вычисляет?) Было бы более естественно оставить эту функцию неопределенной. Мы показываем ниже, как сделать его чистой виртуальной членской функцией.

Прогрессия класса

// . . .

виртуальный длинный nextValue () = 0;//...

;

//абстрактный базовый класс

//чистая виртуальная функция

В результате компилятор не позволит создание объектов типа Progres-Сьон, так как функция nextValue «чиста виртуальный». Однако его производные классы, ArithProgression, например, могут быть определены, потому что они предоставляют определение для этой членской функции.

Интерфейсы и абстрактные базовые классы

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

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

Стек класса

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

виртуальный bool isEmpty () константа = 0; виртуальный недействительный толчок (интервал x) = 0; виртуальная международная популярность () = 0;

;

//сложите интерфейс как абстрактный класс

//действительно ли стек пуст?//продвигаются, x на стек//суют результат возвращения и стек

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

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

показанный ниже.

класс ConcreteStack: общественный Стек//осуществляет Стек

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

виртуальный bool isEmpty ()

виртуальный недействительный толчок (интервал x)Виртуальная международная популярность ()

частный:

// . . .

;

//внедрение участников//... (опущенные детали)

//членские данные для внедрения

2.3

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

Шаблоны

Наследование - только один механизм, который C ++ обеспечивает в поддержку полиморфизма. В этой секции мы рассматриваем иначе - использование шаблонов.

2.3.1 Шаблоны функции

Давайте рассмотрим следующую функцию, которая возвращает минимум двух целых чисел.

интервал integerMin (интервал a, интервал b) //возвращает минимум a и b

возвращаются (<b? a: b);

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

C ++ обеспечивает автоматический механизм, названный шаблоном функции, к про - дуче универсальная функция для произвольного типа T. Шаблон функции обеспечивает четко определенный образец, от которого конкретная функция может позже формально определяться или иллюстрироваться примерами. Пример ниже определяет шаблон функции genericMin.

шаблон <typename T>

T genericMin (T a, T b)

возвратитесь (<b? a: b);

//возвращает минимум a и b

Декларация принимает форму ключевого слова «шаблон», сопровождаемый примечанием <typename T>, который является списком параметра для шаблона. В этом случае, есть