Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по ООП.doc
Скачиваний:
34
Добавлен:
25.03.2015
Размер:
241.66 Кб
Скачать

34. Понятие "параметрическая перегрузка"?

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

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

35. Понятие "переопределение"? в чем заключается различие между перегрузкой и переопределением?

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

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

Переопределение методов вносит свой вклад в совместное использование кода, так как экземпляры классов, которые не переопределяют данный метод, могут использовать одну копию оригинального кода.

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

Производные классы автоматически перенимают все то, что обеспечивает базовый класс. Например, если класс "Лодка" определяет метод "Поставить в док", то производные классы автоматически наследуют его. Если же есть необходимость, то можно в производных классах переопределить реализацию метода требуемым образом. Например, переопределить метод "Поставить в док" для класса "Подводная лодка" Если во время выполнения в программе присутствует указатель на объект типа "Лодка" (а это базовый тип), этот указатель может ссылаться как на парусную или моторную лодку, так и на подводную

36. В чем заключается процесс уточнения?

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

Тип возвращаемого функцией значения в уточнении не участвует.

Например, имеется 4 варианта функции max, определяющей наибольшее из двух значений:

– int max(int, int); // возвращает наибольшее из целых чисел

– char* max(char*, char*); // возвращает подстроку наибольшей длины

– int max(int, char*); // возвращает наибольшее из первого параметра и длины второго

– int max(char*, int); // возвращает наибольшее из второго параметра и длины первого

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

#include <iostream.h>

#include <string.h>

#include <conio.h>

int max(int, int);

char* max(char*, char*);

int max(int, char*);

int max(char*, int);

void f(int a, int b, char *c, char *d)

{

cout<<max(a,b)<<" "<<max(b,d)<<" "<<max(a,c)<<" "<<max(c,d);

}

void main(void)

{

int a=10, b=2;

char c[]="Hi", d[]="Low";

f(a, b, c, d);

}

int max(int value1, int value2)

{

return ( (value1 > value2) ? value1 : value2);

}

int max(int value1, char *value2)

{

return ( (value1 > strlen(value2)) ? value1 : strlen(value2));

}

int max(char *value1, int value2)

{

return ( (strlen(value1) > value2) ? strlen(value1) : value2);

}

char* max(char *value1, char *value2)

{

return ( (strlen(value1) > strlen(value2)) ? value1 : value2);

}

void f(int a, int b, char* c, char* d)

{

cout<<max(a,b)<<max(c,d)<<max(a,c)<<max(c,b);

}

При вызове функции maxкомпилятор выбирает соответствующий типу параметра вариант функции. В данном примере последовательно вызываются все четыре варианта функции.

Если точного соответствия не найдено, выполняются продвижения порядковых типов в соответствии с общими правилами преобразования типов.

Далее выполняются стандартные преобразования типов.

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

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

Для устранения неопределенности можно воспользоваться явным приведением типа.