
- •Оглавление
- •Цикл жизни программного обеспечения
- •Начальные этапы разработки по
- •Общие требования к методологии и проектированию по
- •Качество и надежность программного обеспечения
- •Показатели качества
- •Сложность комплексов программ
- •Надежность комплексов программ
- •Критерии надежности
- •Сбой, отказ, восстановление
- •Алгоритмы сортировки
- •Введение
- •Внутренняя сортировка
- •Сравнение эффективности алгоритмов сортировки
- •Простая сортировка вставками
- •Быстрая сортировка Хоара. Сортировка методом пузырька
- •Сортировка методом «турнира с выбыванием»
- •Реализация сортировки вставками. Алгоритм Шелла.
- •Сортировка слиянием. Поразрядная сортировка
- •Поиск данных
- •Введение в поиск данных
- •Последовательный поиск
- •Поиск в упорядоченной таблице
- •Бинарный поиск
- •Поиск по дереву
- •Вставка в дерево бинарного поиска
- •Удаление из дерева бинарного поиска
- •Хеширование
- •Разрешение коллизий при хешировании методом открытой адресации
- •Выбор хеш-функции
- •Объектно-ориентированное программирование
- •Введение в объектно-ориентированное программирование
- •Инкапсуляция
- •Полиморфизм
- •Конструкторы и деструкторы
- •Наследование
- •Объединения, встраиваемые функции
- •Указатели и адреса
- •Программирование параллельных вычислений
- •Введение
- •Сети. Родитель сети
- •Синхронизация процессов
- •Литература
Полиморфизм
Полиморфизм - это свойство, которое позволяет одно и то же имя использовать для решения двух или более задач, но технически разных. Целью полиморфизма, применительно к ООП, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом и/или количеством данных. Например, в языке С++ можно использовать одно имя функции для множества различных действий. Это называется перегрузкой функции. В более общем смысле концепцией полиморфизма является идея «один интерфейс, множество методов». Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. При этом выполнение конкретного действия зависит от данных. Преимуществом полиморфизма является то, что он помогает снижать сложность программ. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Полиморфизм может применяться и к функциям, и к операциям.
Остановимся на понятии перегрузка функций. Перегрузка функций не только обеспечивает тот механизм, посредством которого в С++ достигается один из типов полиморфизма, она также формирует то ядро, вокруг которого развивается среда программирования. Перегрузить функцию очень легко: просто объявите и задайте все требуемые варианты. Компилятор автоматически выберет правильный вариант вызова на основании числа или /и типа используемых в функции аргументов. То есть, имеем один интерфейс и множество методов.
Рассмотрим пример определения абсолютного значения числа, представляемого как целое, как длинное целое и как число с плавающей точкой на основе введения перегрузки функции.
# include < iostream.h >
// Перегрузка abs() тремя способами
int abs( int n);
long abs( long n);
double abs( double n);
main()
{
cout << ‘’ Абсолютная величина -10:’’ << abs(-10) << ‘’\n’’;
cout << ‘’ Абсолютная величина -10L:’’ << abs(-10L) << ‘’\n’’;
cout << ‘’ Абсолютная величина -10.01:’’ << abs(-10.01) << ‘’\n’’;
return 0;
}
int abs( int n)
{ return n < 0 ? -n : n; }
long abs(long n)
{ return n < 0 ? -n : n;}
double abs(double n)
{ return n < 0 ? -n : n;}
Как можно заметить, в программе задано три функции abs(), своя функция для каждого типа данных. Внутри main() abs() вызывается с тремя аргументами разных типов. Компилятор автоматически вызывает правильную версию abs(), основываясь на используемом в аргументе типе данных. На этом простом примере видна ценность перегрузки функций. На компилятор возлагается задача выбора соответствующей конкретной версии вызываемой функции, а значит и метода обработки данных. Это имеет лавинообразный эффект для снижения сложности программ. В данном случае, благодаря использованию полиморфизма, из трех имен получилось одно. Перегружаемые функции могут отличаться не только типом своих переменных, но и числом параметров. Рассмотрим пример такого полиморфизма:
# include < iostream.h>
void f1( int a);
void f1( int a ,int b);
main()
{
f1(10);
f1(10,20);
return 0;
}
void f1( int a)
{
cout << ‘’В f1:’’<<a<<’’ \n’’;
}
void f1( int a,int b)
{
cout <<’’ В f1:’’<<a<<b’’ \n’’;
}