Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
439.97 Кб
Скачать

6. Полиморфизм

Полиморфизм – это возможность принимать множество форм, иметь разный смысл в зависимости от ситуации.

Полиморфизм в языке С++ позволяет программисту:

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

  • Определять действие операторов для абстрактных типов данных - перегрузка операторов. В результате для абстрактных типов данных можно использовать привычные операторы: + для сложения или объединения двух объектов, = для присвоения одного экземпляра объекта другому и т.д.

6.1. Перегрузка функций

6.1.1. Перегрузка функций

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

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

функции, выполняющие одинаковые действия для разных типов:

перегруженные функции:

print_double(double d);

print_Lens(Lens l);

print_2(double x, double y);

void print(double d);

void print(Lens l);

void print(double x, double y);

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

  1. Проверка точного соответствия типов аргументов функции и передаваемых параметров

  2. Попытка “повышения типов” (short -> int, flot -> double и т.д.)

  3. Попытка стандартных преобразований (int -> double, double -> int, указатели -> void* и т.д.)

  4. Преобразование, явно задаваемое программистом

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

float sqrt(float);

float sqrt(double);

double sqrt(double);

6.1.2. Преобразование типов

Правила автоматического преобразования типов

  1. bool, char повышается до int

  2. int < long < flot < double. Операнд более низкого типа повышается до более высокого.

Явное преобразование типов:

  1. (тип) выражение - ( int) x;

  2. тип (выражение) – int (x);

Для классов для преобразования типов используется конструктор с одним параметром:

// преобразование из double в Complex

Complex::Complex(double x)

{

m_re=x;

m_im=0.;

}

// пример использования

Complex x;

x=Complex(3.14);

Однако для некоторых типов данных использование конструктора для преобразования типа не имеет смысла и может приводить к нежелательным последствиям. Оператор explicit запрещает неявный вызов конструктора для преобразования типа:

// оператор explicit запрещает неявный вызов конструктора для преобразования типа

class Matrix

{

public:

explicit Matrix(int size);

}

Matrix::Matrix(int size)

{

m_data=new double[size*size];

}