09 static polymorphism
TRANSCRIPT
Бублик Володимир Васильович
Програмування - 2
Лекція 9. Процедурне програмування.
Статичний поліморфізм
Лекції для студентів 2 курсу
1. Функціональна полісемія
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
3
Непряме звернення до функцій
Оголошення указника функції• double (*f) (double);
Визначення з ініціалізацією• double (*f ) (double) = 0;• double (*trigon) (double) = sin;
Присвоєння• trigon = cos;
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
4
Виклик за указником
• #include <cmath>
• int main()• {• double (*trigon) (double) = sin;• cout<<trigon(0)<<endl;• trigon = cos;• cout<<trigon(0)<<endl;
• return 0;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
5
Масиви указників функцій
• const int n = 10;• double (*g[n]) (double);
• typedef double (*F) (double);
• F * pf = new F[n];
• g[1] = sin;• pf[2] = exp;
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
6
Функціонали
Розв'язування рівнянь методом ділення навпілR x R x R x [R -> R] -> R
• double Newton (double a, double b, double eps,• double (*f) (double));
• double Simpson (double a, double b, double eps,• double (*f) (double));
В яких випадках бажано або необхідно мати одне спільне позначення для різних дій?
2. Розширення області визначення (overloading) функцій
Що бракує С?
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
8
Мінімізація понять
На всі випадки один символ для додавання
• Натуральні 1+2 // 1 +n 2 • Цілі -1+2 // -1 +i 2
• Раціональні ⅓ + ⅝ // ⅓ +z ⅝• Дійсні φ + 2πk // φ +r 2πk
• Комплексні (a + bi) + (c + di) // (a ☺ bi) ☻ (c ☺ di)• Вектори u+v• Матриці A+B
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
9
Однойменні функції
Обмін цілих значень• void pswap ( int *x, int *y); // стиль С• void rswap ( int &x, int &y); // стиль С++
Як назвати цю ж функцію для дійсних (символьних, …) значень?
• void pswap_char (char *x, char *y); //?• void pswap_1 (char *x, char *y); //?
Краще всього так само pswap або відповідно rswap
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
10
Overloading
Якщо функція визначається сигнатурою, а не тільки іменем, то кожній сигнатурі приписуємо свою реалізацію
• void pswap ( int *x, int *y);• void pswap ( char *x, char *y);• void pswap (double *x, double *y);
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
11
Виклики
Якщо функція визначається сигнатурою, а не тільки іменем, то за типами фактичних параметрів можна встановити, функція якої саме сигнатури викликається
• char a, b;• int m, n;• float x, y;
• pswap (&a, &b);• pswap (&m, &n);• pswap (&x, &y);
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
12
Перший висновок
Якщо функція визначається сигнатурою, а не тільки іменем, то немає більше необхідності в різних іменах pswap і rswap для функцій swap, що різнитимуться типами параметрів: указниками та відсилками
• void swap ( int &x, int &y);• void swap ( int *x, int *y);
Але для сигнатури• void swap ( int x, int y);вже немає місця (чому?)
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
13
Функції swap: різні способи передачі параметрів
• void swap ( int *x, int *y)• {• int z=*x; *x=*y; *y=z;• return;• }
• void swap ( int &x, int &y)• {• int z=x; x=y; y=z;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
14
Функції swap: різні типи даних
• void swap (double *x, double *y)• {• double z=*x; *x=*y; *y=z;• return;• }
• void swap (double &x, double &y)• {• double z=x; x=y; y=z;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
15
Функції swap: різні реалізації
• void swap ( int *x, int *y)• {• *x=*x+*y; *y=*x-*y;*x=*x-*y;• return;• }
• void swap ( int &x, int &y)• {• x=x+y; y=x-y; x=x-y;• }
3. Розширення області визначення (overloading) операцій
Що ще бракує С?
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
17
Довизначені операції
• struct Point• { • double _x;• double _y;• };• const Point plus(Point u, Point v) //дуже незграбно• { • Point res;• res._x = u._x+v._x;• res._y = u._y+v._y;• return res;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
18
Так краще
• int main()• {•• const Point one_zero = {1, 0};• Point u = {2, 3};• Point v = u + one_zero;
• cout<<v._x<<v._y<<endl;•• return 0;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
19
Так ще краще
• int main()• {•• const Point one = {1, 0};• Point u = {2, 3};• Point v = u + one;
• cout<<v<<endl;•• return 0;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
20
Або навіть
• int main()• {•• const Point one_zero = {1, 0};• Point u = {2, 3};•• cout<< u + one_zero <<endl;•• return 0;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
21
Point.h
// Arithmetic• const Point operator+ (const Point &, const Point &);// Варіація// Point operator+ (Point , Point);
// Boolean• bool operator== (const Point &, const Point &);
// Input-output• ostream& operator<<(ostream &os, const Point &);• istream& operator>>(istream &is, Point &);
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
22
Погодження
Замість• plus (u, v); або operator+(u, v);Пишемо• u+v;
Відповідно замість суперпозиції• operator+(u, operator+(v, w));звичайний запис• u+v+w;
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
23
Point.cpp
• const Point operator+(const Point & u, const Point & v)
• { • Point res = {u._x+v._x, u._y+v._y};• return res;• }
• bool operator==(const Point& u, const Point & v)• {• return (u._x == v._x) && (u._y == v._y);• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
24
Point.cpp
• ostream& operator<<(ostream &os, const Point& u)• {• os<<'('<<u._x<<','<<u._y<<')';• return os;• }
• istream& operator>>(istream &is, Point& u)• {• is>>u._x>>u._y;• return is;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
25
Змішані типи
• struct Complex• { • double _re; • double _im;• };•• // Arithmetic• Complex operator+ (const Complex &, const
Complex &);• Complex operator+ (double, const Complex &);• Complex operator+ (const Complex &, double);
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
26
Змішані типи
• const Complex i = {0, 1};• Complex z = {1, 1};• double x = 2, y=3;• cout << (x +5) + (z+i) + y<<endl;
• Complex operator+ (const Complex &, const Complex &);
• Complex operator+ (double, const Complex &);• Complex operator+ (const Complex &, double);• ostream& operator<<(ostream &os, const Complex &);
Як визначити одне додавання для всіх? (далі буде)
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
27
Множення
• struct WrappedVector• {• static const int n;• double * x;• };
• double operator*(const WrappedVector&, const WrappedVector&);
Або (але не одночасно, чому?)• const WrappedVector operator*
(const WrappedVector&, const WrappedVector&);
4. Узагальнені функції(function template)
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
29
Мінімізація текстів
• void swap ( int &x, int &y);• void swap ( char &x, char &y);• void swap ( float &x, float &y);
Записати три і більше реалізацій одним текстом
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
30
Myswap.h
Куди помістити?
• template <typename T>• void myswap (T &x, T &y)• {• T z = x; x = y; y = z;• return;• }
Чому не Myswap.сpp?
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
31
Myswap.cpp
• int m=10, n=20;• myswap (m, n);
• double a=1.25, b = 2.50;• myswap (a, b);
• Point u ={1,2}, v={3,4};• myswap(u,v);
• Complex z1 = {1,1}, z2 = {2,2};• myswap (z1, z2);
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
32
Конкретизація
• int m=10, n=20;• short k=50, i=40;•• myswap<int> (m, n);• myswap (m, n);• myswap (i, k);// Звичайна функція• void myswap ( int &x, int &y)• {• cout<<"Non template"<<endl;• x=x+y; y=x-y; x=x-y;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
33
Союз довизначень і узагальнень
Для типу Т повинні бути визначені всі функції і операції, вжиті в узагальненій функції
• template <typename T>• T max(T x, Ty)• {• return (x>y)?x:y;• }
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
34
Союз довизначень і узагальнень
• int m=10, n=20;• cout<<max (m, n)<<endl;
• double a=1.25, b = 2.50;• cout<<max (a, b) <<endl;
• Point u ={1,2}, v={3,4};• // max (u,v); ERROR
• Complex z1 = {1,1}, z2 = {2,2};• // max (z1, z2); ERROR
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
35
Складність компіляції
• Вибір функції за типами фактичних параметрів з урахуванням можливих перетворень типів, використання замовчуваних значень параметрів, можливостей конкретизації шаблонів. В деяких випадках компілятор не справляється з однозначним визначенням потрібної функції
© Бублик В.В. Програмування-2. 9. Процедурне програмування. Статичний поліморфізм
36
Висновок
Поліморфізм полягає у використанні об'єктів, що можуть набувати багатьох різних типів.
При динамічному поліморфізмі тип об'єкта визначиться лише на етапі виконання (далі буде).
Статичний поліморфізм ― це визначення типів, використаних узагальненою функцією, на етапі компіляції з одночасною конкретизацією шаблону або вибором підходящої звичайної функції. Конкретизація можлива, якщо всі вирази шаблону визначені для конкретизуючого типу