Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 15 лет назад пользователемneposuda
1 МЕТОДИ ОБ'ЄКТНО- ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ Бублик В.В. Кафедра мультимедійних систем, кімн. 204/1 Консультації: вівторок, середа год. You are welcome! Stockholm, Kungliga Tekniska Högskolan
2 Тема 6. Узагальнене програмування Корисно повторити: Об'єктне програмування. Лекція 8. Параметризовані класи
3 Динамічний поліморфізм Чи завжди він потрібен?
4 © 2006 Бублик В.В. МООП-9. Узагальнене програмування4 (45) Динамічний поліморфізм Пізнє зв'язування віртуальних функцій вимагає Ієрархії класів Дотримання дисципліни стабільного інтерфейсу нетермінальних класів Накладних витрат непрямого виклику
5 © 2006 Бублик В.В. МООП-9. Узагальнене програмування5 (45) П оліморф на і єрархія класів Базовий клас class Base { public: virtual void vf() { cout
6 © 2006 Бублик В.В. МООП-9. Узагальнене програмування6 (45) П оліморф на і єрархія класів Похідний клас class Derived: public Base { public: virtual void vf() { cout
7 © 2006 Бублик В.В. МООП-9. Узагальнене програмування7 (45) Заміщення при пізньо му зв'язуванн і void manipulator(Base & x){ x.f(); x.g(); } Base b; Derived d; manipulator(b);//Base::f();Base::g() manipulator(d);//Derived:: f();Base::g()
8 © 2006 Бублик В.В. МООП-9. Узагальнене програмування8 (45) Накладн і витрат и поліморфізму x.f();//виклик віртуальної функції mov edx,dword ptr [ebp+8] A mov eax,dword ptr [edx] C mov esi,esp E mov ecx,dword ptr [ebp+8] call dword ptr [eax] cmp esi,esp call __chkesp ( ) A x.g();//виклик невіртуальної функції mov ecx,dword ptr [ebp+8] ( a)
9 © 2006 Бублик В.В. МООП-9. Узагальнене програмування9 (45) Внесення стабільного інтерфейсу Базовий клас class NVIBase { public: void vf() { dovf(); return;} void g() { cout
10 © 2006 Бублик В.В. МООП-9. Узагальнене програмування10 (45) Внесення стабільного інтерфейсу Похідний клас class NVIDerived: public NVIBase { private: virtual void dovf() { cout
11 © 2006 Бублик В.В. МООП-9. Узагальнене програмування11 (45) Накладні витрати невіртуального інтерфейсу Без особливих додаткових накладних витрат: один зайвий виклик невіртуальної інтерфейсної функції x.vf(); 00416E5E mov ecx,dword ptr [x] 00416E61 call NVIBase::vf (415EFBh)
12 © 2006 Бублик В.В. МООП-9. Узагальнене програмування12 (45) Виділення абстрактного нетермінального класу Базовий клас class NVINTBase { public: void vf() { dovf(); return;} void g() { cout
13 © 2006 Бублик В.В. МООП-9. Узагальнене програмування13 (45) Виділення абстрактного нетермінального класу Похідні класи class NVITBase: public NVINTBase {}; class NVITDerived: public NVINTBase { private: virtual void dovf() { cout
14 © 2006 Бублик В.В. МООП-9. Узагальнене програмування14 (45) Порівняння викликів деструкторів Виклик невіртуального деструктора delete nvip; D mov eax,dword ptr [nvip] mov dword ptr [ebp-158h],eax mov ecx,dword ptr [ebp-158h] C push ecx D call operator delete (41550Fh) add esp,4
15 © 2006 Бублик В.В. МООП-9. Узагальнене програмування15 (45) Порівняння викликів деструкторів Накладні витрати віртуального деструктора delete pb; mov eax,dword ptr [pb] mov dword ptr [ebp-134h],eax mov ecx,dword ptr [ebp-134h] F mov dword ptr [ebp-140h],ecx cmp dword ptr [ebp-140h], C je main+151h (4377C1h) E mov esi,esp A0 push A2 mov edx,dword ptr [ebp-140h] A8 mov eax,dword ptr [edx] AA mov ecx,dword ptr [ebp-140h] B0 call dword ptr [eax] B2 cmp esi,esp B4 (415AF0h) B9 mov dword ptr [ebp-16Ch],eax BF jmp main+15Bh (4377CBh) C1 mov dword ptr [ebp-16Ch],0
16 © 2006 Бублик В.В. МООП-9. Узагальнене програмування16 (45) Висновок Повна гнучкість рішень за рахунок динамічного розпізнавання типу об'єкту при значних затратах як на етапі програмування, так і виконання
17 © 2006 Бублик В.В. МООП-9. Узагальнене програмування17 (45) Невіртуальна ієрархія class Base { public: void f() {cout
18 © 2006 Бублик В.В. МООП-9. Узагальнене програмування18 (45) Раннє зв'язування void manipulator(Base & x){ x.f(); x.g(); } Base b; Derived d; manipulator(b);//Base::f();Base::g() manipulator(d);// Base::f();Base::g()
19 © 2006 Бублик В.В. МООП-9. Узагальнене програмування19 (45) Висновок Раннє зв'язування не забезпечує заміщень: при підстановці параметром об'єкту похідного класу викликаються функції базового
20 © 2006 Бублик В.В. МООП-9. Узагальнене програмування20 (45) Узагальнений маніпулятор ієрархією класів template void manipulator(T & x){ x.f(); x.g(); } Base b; Derived d; manipulator(b);//Base::f();Base::g() manipulator(d);//Derived:: f();Base::g()
21 © 2006 Бублик В.В. МООП-9. Узагальнене програмування21 (45) Висновок Шаблон, застосований до ієрархії, доповненої явним делегуванням, моделює статичний поліморфізм
22 © 2006 Бублик В.В. МООП-9. Узагальнене програмування22 (45) На городі бузина... class ElderBerry// бузина { public: void f(char a='!', double x=1, bool t=true) { cout
23 © 2006 Бублик В.В. МООП-9. Узагальнене програмування23 (45) А де Murgatroyd? class Murgatroyd { public: void f() { cout
24 © 2006 Бублик В.В. МООП-9. Узагальнене програмування24 (45) Узагальнена функція template void manipulator(T & x){ x.f(); x.g(); } ElderBerry u; Murgatroyd v; manipulator(u); // ElderBerry::f(), ElderBerry:: g() manipulator(v);// Murgatroyd ::f(), ElderBerry:: g()
25 © 2006 Бублик В.В. МООП-9. Узагальнене програмування25 (45) Поліморфізм без ієрархії Методи узагальненого програмування дозволяють промоделювати статичний поліморфізм не застосовуючи ієрархії класів, а лише їх знайомств за умови узгодженості їх поведінки
26 © 2006 Бублик В.В. МООП-9. Узагальнене програмування26 (45) Висновок Кожен початківець хоче продемонструвати володіння успадкуванням (90% випадків) Віртуальні функції найчастіше вживаються некоректно Застосовувати динамічний поліморфізм варто лише тоді, коли статичного не вистачає Узагальнене програмування найпотужніший механізм статичного поліморфізму, але...
27 Безпечність узагальненого програмування Наперед невідомо, який саме тип буде підставлено до шаблону: як гарантувати працездатність за мінімальних вимог до типового параметру? Як уникнути збоїв на етапі виконання?
28 © 2006 Бублик В.В. МООП-9. Узагальнене програмування28 (45) Синтаксичний контроль типів 1.Успадкування типів 2.Зведення типів 3.Примітивність типів 4.Індексованість типів
29 © 2006 Бублик В.В. МООП-9. Узагальнене програмування29 (45) Типізація (за Бучем) Засіб захисту від використання обєктів одного класу замість іншого, або принаймні спосіб управління цим використанням.
30 © 2006 Бублик В.В. МООП-9. Узагальнене програмування30 (45) Шаблон з одним параметром Пробуємо розмістити значення Того ж типу Т на новому місці template void construct( T*& p, const T& value ) { p =new T(value); return; }
31 © 2006 Бублик В.В. МООП-9. Узагальнене програмування31 (45) Застосування шаблону void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, ); construct( p2, b ); construct( p1, 42 ); construct( p2, d ); }
32 © 2006 Бублик В.В. МООП-9. Узагальнене програмування32 (45) Результати першої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, ); construct( p2, b ); //construct( p1, 42 ); 42 is int construct ( p1, 42 ); //construct( p2, d ); d is Derived construct ( p2, d ); }
33 © 2006 Бублик В.В. МООП-9. Узагальнене програмування33 (45) Висновок (з першої спроби) Надто жорстка умова на типовий параметр
34 © 2006 Бублик В.В. МООП-9. Узагальнене програмування34 (45) Шаблон з двома параметрами Пробуємо розмістити значення типу Т2 на новому місці за указником типу Т1 Як уникнути недопустимих комбінацій типів template void construct( T1*& p, const T2& value ) { p =new T2(value); return; }
35 © 2006 Бублик В.В. МООП-9. Узагальнене програмування35 (45) Обмеження на успадкування template struct must_have_base { ~must_have_base() { void (*p)(Derived*, Base*) = constraints; } private: static void constraints(Derived* pd, Base* pb) { pb=pd; } };
36 © 2006 Бублик В.В. МООП-9. Узагальнене програмування36 (45) Шаблон, доповнений перевіркою підтипів Спроба використати недопустиму комбінацію типів діагностується компілятором template void construct( T1*& p, const T2& value ) { must_have_base check; p =new T2(value); return; }
37 © 2006 Бублик В.В. МООП-9. Узагальнене програмування37 (45) Результати другої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, ); construct( p2, b ); //construct( p1, 42 ); 42 is int //construct ( p1, 42 ); не підтип construct( p2, d ); // ОК d is Derived construct ( p2, d ); }
38 © 2006 Бублик В.В. МООП-9. Узагальнене програмування38 (45) Обмеження на зводимість template struct must_be_converted { ~must_be_converted() { void (*p)(Type &, const Convert &) = constraints; } private: static void constraints(Type & s, const Convert & t) { s=t; } };
39 © 2006 Бублик В.В. МООП-9. Узагальнене програмування39 (45) Шаблон, доповнений перевіркою зведення типів Спроба використати недопустиму комбінацію типів діагностується компілятором template void construct( T1*& p, const T2& value ) { must_be_converted check; p =new T2(value); return; }
40 © 2006 Бублик В.В. МООП-9. Узагальнене програмування40 (45) Результати третьої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, ); construct( p2, b ); construct( p1, 42 ); // ОК 42 converted to double construct ( p1, 42 ); construct( p2, d ); // ОК d is Derived construct ( p2, d ); }
41 © 2006 Бублик В.В. МООП-9. Узагальнене програмування41 (45) Перевірка примітивності типу template struct must_be_POD { ~must_be_POD() { void (*p)() = constraints; } private: static void constraints() { union{ T T_is_not_POD_type;}; } };
42 Приклади інших перевірок
43 © 2006 Бублик В.В. МООП-9. Узагальнене програмування43 (45) Перевірка індексованості template struct must_be_subscriptable { ~must_be_subscriptable() { void (*p)(const T &) = constraints; } private: static void constraints (const T& T_is_not_subscriptable) { sizeof(T_is_not_subscriptable[0]); } };
44 © 2006 Бублик В.В. МООП-9. Узагальнене програмування44 (45) Перевірка розмірностей template struct must_have_same_size { ~must_have_same_size() { void (*p)() = constraints; } private: static void constraints() { const int T1_not_same_size_as_T2 = sizeof(T1) == sizeof(T2); int i[T1_not_same_size_as_T2]; } };
45 © 2006 Бублик В.В. МООП-9. Узагальнене програмування45 (45) Висновок Збалансовуйте застосування успадкувань і шаблонів Зважено контролюйте типи, але не вимагайте від них більше, ніж потрібно
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.