- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Параллельное и распределенное программирование на С++ - Хьюз Камерон
Шрифт:
Интервал:
Закладка:
Полиморфиз м— одна из основных характеристик объектно-ориентированного програ мм ирования. Если язык претенлует на поддержку объектно-ориентированно г о програ мм ирования, он должен по д держивать инкапсуляцию, нас л едование и по л и м орфиз м. По л и м орфиз м — это способность объекта прини м ать м ножество форм. По л иморфизм по д держивает понятие «один интерфейс — множество реализаций • Пользователь использует одно имя, или интерфейс, реализованный различными способами и различными объекта м и. Чтобы проиллюстрировать концепцию поли м орфизма, рассмотри м класс vehicle, его пото м ков и простую функцию travel (), которая использует класс vehicle. На рис. 9.2 показана простая иерархия нашего се м ейства класса vehicle.
Рис. 9.2. Иерархия семейства класса vehicle
Самолеты, вертолеты, автомобили и подводные лодки — все это потомки класса vehicle (транспортные средства). Объект класса vehicle может заводить мотор, перемещаться вперед, поворачивать вправо, поворачивать влево, останавливаться и пр. В листинге 9.4 демонстрируется, как функция travel () использует объект класca vehicle для совершения компьютеризованного путешестви я.
// Листинг 9.4.
//Функция travel(), которая в качестве параметра использует объект класса vehicle
void travel(vehicle *Transport) {
Transport->startEngine(); Transport->moveForward() ; Transport->turnLeft();
//.. .
Transport-> stop();
}
int main(int argc, char *argv[J) {
//.. . car *Car;
Transportation = new Vechicle(); travel(Car); //.. .
}
Функция travel () принимает указатель на объект класса vehicle и вызывает методы объекта класса vehicle. Обратите внимание на то, что функция main() в листинге 9.4 объявляет объект типа саг, а не vehicle, а также на то, что функции travel () вместо объекта типа vehicle передается объект типа car. Это возможно благодаря тому, что в С++ указатель на класс может ссылаться на объект этого типа или на любой объект, который является потомком этого типа. Поскольку класс саг является производным от класса vehicle, то указатель на тип vehicle может ссылаться на объект типа саг. Функция travel () написана без учета того, какими конкретно типами vehicle- объектов она будет манипулировать. Для функции travel () вполне достаточно, чтобы ее vehicle -объекты могли запускать мотор, двигаться вперед, поворачивать влево, вправо и т.д. Если vehicle -объект способен выполнять эти действия, то функция travel () сможет справиться со своей работой. Обратите внимание на то, что на рис. 9.2 методы класса vehicle объявлены как виртуальные (virtual). Объявление методов виртуальными в базовом классе является необходимым условием динамического полиморфизма. В каждом из классов car, helicopter, submarine и airplane будут определены следующие функции.
startEngine(); moveForward(); turnLeft(); turnRight(); stop(); //.. .
При этом объявление каждой функции будет соответствовать типу транспортного средства. Несмотря на то что транспортное средство каждого типа способно двигаться вперед, метод, в котором обеспечивается движение автомобиля, отличается от метода перемещения подводной лодки. Управление поворотом вправо у самолета отличается от управления таким же поворотом у автомобиля. Следовательно, транспорт-ное средство каждого типа должно реализовать необходимые операции для получения законченного описания «своего» класса. Поскольку эти операции объявляются как виртуальные в базовом классе, они и являются кандидатами для реализации полиморфизма. Если vehicle -указатель, переданный функции travel (), в действительности ссылается на объект типа car, то методами, вызываемыми в этой функции (startEngine (), moveForward() и пр.), реально окажутся те, которые определены в классе car. Если vehicle -указатель, переданный функции travel (), вдействительности ссылается на объект класса airplane, то методами, вызываемыми в этой функции, реально окажутся те, которые определены в классе airplane. Это и есть тот случай, когда много форм реализуется при одном интерфейсе. Несмотря на то что функция travel () вызывает только один набор методов, поведе н ие этих м етодов может радикаль н о отличаться в зависи м ости от то г о, указатель на объект како г о vehicle -класса был назначен vehicle -указателю. По л и м орфиз м фу н кции travel () состоит в то м, что при каждо м вызове о н а м ожет выпо лн ять соверше нн о раз н ые действия. И в самом де л е, поско л ьку фу н кция travel () испо л ьзует указате л ь на к л асс vehicle, в булу щ ем ее можно испо л ьзовать д л я типов, производных от к л асса vehicle, которые бы л и неизвестны и л и не су щ ествовали во время разработки функции travel(). До тех пор пока буду щ ие vehicle -к л ассы будут нас л едовать к л асс vehicle и опреде л ять необходимые методы, ими можно будет управ л ять с помо щ ью фу н кции travel (). Этот тип по л иморфизма называется динамическим (runtime polymorphism), поско л ьку фу н кция travel () н е знает точно, какие и м енно функции startEngine (), moveForward( ) и л и turnLeft () она будет вызывать, до тех пор, пока про г ра мм а не начнет выпо л няться.
Этот тип полиморфиз м а полезен при реализации MPI-програ мм, которые используют модель MPMD. Если MPI-задачи работают с указател ям и на базовые классы, то полиморфиз м позволяет MPI-классу также работать с любы м и класса м и, производными от не г о. Предположи м, что в м есто объявления с указателе м функция travel () (см. листин г 9.4) имела бы такое объявление: void travel(vehicle Transport);
В этом случае при обра щ ении к функциям startEngine (), moveForward () и прочим вызывались бы м етоды, принадлежа щ ие только классу vehicle, и обращение к производным классам было пробле м атичны м. Использование же указателя на класс vehicle и объявления м етодов в классе vehicle виртуальны м и (virtual) заставляют работать м еханиз м поли м орфиз м а. MPI-задачи, которые м анипулируют указателями на базовые классы, мо г ут точно так же использовать преиму щ ества полиморфизма, как функции travel () удается работать с любым типом vehicle-объекта (настоя щ и м или булу щ им). Этот метод открывает большие перспективы дл я булу щ е г о кластерных приложений, а также приложений SMP (Symmetrical Multiprocessing — симметричнал мно г опроцессорнал обработка) и MPP (Massively Parallel Processing — массовал параллельнал обработка), в которых необходимо реализовать модели MPMD. Чтобы понять, как модель MPMD работает в MPI-контексте, попробуем использовать нашу функцию travel () в качестве МРТзадачи, которая является частью подсистемы поиска. Все MPI-задачи отвечают за выполнение поисково-спасательных операций применительно к vehicle-объектам различного типа. Очевидно, что каждое транспортное средство (vehicle-объект) характеризуется рааличными способами движения. Несмотря на то что проблема, стоя щ ал перед всеми MPI-задачами, заключается в выполнении поиска, все они будут иметь различные коды, поскольку все эти задачи используют различные виды vehicle-объектов, которые работают по-разно м у и требуют различных данных. Код, который содержится в листинге 9.5, необходимо запустить в нашей среде MPICH с по м о щ ью слелую щ ей ко м анды.
