Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры / ООП(Тимофеев) / ООП-Тимофеев.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
328.19 Кб
Скачать

Ad hoc полиморфизм

Полиморфизм (polymorphism) — это способ присваивать различные значения (смыс­лы) одному и тому же сообщению. Смысл зависит от типа обрабатываемых данных. «Объектно-ориентированность» использует преимущества полиморфизма, привя­зывая поведение к типу объекта. Такие операторы, как + или « могут иметь различ­ный смысл в зависимости от типов операндов.

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

Операторы перегружаются и выбираются на основе алгоритма соответствия сиг­натуре. Перегрузка операторов придает им новые значения. Например, выражение а + b имеет различные значения, зависящие от типа переменных а и Ь. Перегрузка оператора + для определяемых пользователем типов дает возможность применять их в выражениях сложения почти таким же образом, как собственные типы. Выражение а + b может означать конкатенацию строк, сложение комплексных чисел или сло­жение целых, в зависимости от того, являются ли переменные абстрактными типами данных my_string или complex, или собственным типом int. Аналогично, благо­даря функциям преобразования возможны выражения смешанных типов. В этой гла­ве также обсуждаются дружественные функции (friend function), и почему они кри­тичны для перегрузки операторов.

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

Преобразования АТД

Явное преобразование типов в выражениях необходимо, если неявное преобразование нежелательно или если без такого преобразования выражение будет недопустимым. Одна из задач ООП на C ++ состоит в интеграции определяемых пользователем АТД и встроенных типов. Для этого существует механизм, позволяющий функциям-членам обеспечивать явные преобразования.

my_string::my_string(const char* p);

Этот конструктор будет автоматически преобразовывать тип char* к типу my_string. Преобразование может быть как явным, так и неявным. Явно оно используется как операция преобразования в функциональной форме или в виде приведения. Так, и приведение

my_string s; char* logo = "Рога и Копыта Лтд."; s = static_cast<my_string>(logo);

и преобразование s = logo; //неявный вызов преобразования

будут работать

Однако пользователь не может добавить конструктор во встроенный тип, такой как int или double. С другой стороны, можно определить специальную функцию преобразования внутри класса. В общем виде подобная функция-член выглядит такoperator тип() { ••••• }

.Перегрузка и выбор функций

Перегруженные функции являются важным дополнением C++. Конкретная функция выбирается в зависимости от соответствия списка аргументов при вызове функции списку параметров в объявлении функции. Когда вызывается перегруженная функ­ция, компилятор должен иметь алгоритм для выбора надлежащей функции. Алго­ритм, который выполняет этот выбор, зависит от того, преобразования какого типа присутствуют. Наилучшее соответствие должно быть уникальным. Оно должно быть лучшим по крайней мере для одного аргумента и так же хорошо, как остальные соответствия, для всех других аргументов.

Ниже приведен алгоритм соответствия для каждого аргумента.

Соседние файлы в папке ООП(Тимофеев)