🗊МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007 Бублик В.В. Кафедра мультимедійних систем, кімн. 204/1 Консультації: вівторок, сере

Категория: Технологии
Нажмите для полного просмотра!
МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №1МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №2МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №3МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №4МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №5МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №6МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №7МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №8МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №9МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №10МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №11МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №12МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №13МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №14МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №15МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №16МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №17МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №18МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №19МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №20МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №21МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №22МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №23МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №24МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №25МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №26МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №27МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №28МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №29МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №30МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №31МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №32МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №33МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №34МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №35МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №36МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №37МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №38МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №39МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №40МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №41МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №42МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №43МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №44МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007  Бублик В.В.  Кафедра мультимедійних систем, кімн. 204/1  Консультації: вівторок, сере, слайд №45

Содержание

Вы можете ознакомиться и скачать МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007 Бублик В.В. Кафедра мультимедійних систем, кімн. 204/1 Консультації: вівторок, сере. Презентация содержит 45 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007
Бублик В.В.
Кафедра мультимедійних систем, кімн. 204/1
Консультації: вівторок, середа
                     15-16 год.
http://emerecu.ukma.kiev.ua/efolio
Описание слайда:
МЕТОДИ ОБ'ЄКТНО-ОРІЄНТОВАНОГО ПРОГРАМУВАННЯ - 2007 Бублик В.В. Кафедра мультимедійних систем, кімн. 204/1 Консультації: вівторок, середа 15-16 год. http://emerecu.ukma.kiev.ua/efolio

Слайд 2





Тема 6.
Узагальнене програмування
Корисно повторити:
Об'єктне програмування.
Лекція 8. Параметризовані класи
Описание слайда:
Тема 6. Узагальнене програмування Корисно повторити: Об'єктне програмування. Лекція 8. Параметризовані класи

Слайд 3





Динамічний поліморфізм
Чи завжди він потрібен?
Описание слайда:
Динамічний поліморфізм Чи завжди він потрібен?

Слайд 4





Динамічний поліморфізм
Пізнє зв'язування віртуальних функцій вимагає
Ієрархії класів
Дотримання дисципліни
стабільного інтерфейсу
нетермінальних класів
Накладних витрат непрямого виклику
Описание слайда:
Динамічний поліморфізм Пізнє зв'язування віртуальних функцій вимагає Ієрархії класів Дотримання дисципліни стабільного інтерфейсу нетермінальних класів Накладних витрат непрямого виклику

Слайд 5





Поліморфна ієрархія класів
Базовий клас
class Base {
public:
	virtual void vf() {
		cout<<"Base::f()"<<endl; }
	void g() {
		cout<<"Base::g()"<<endl; }
};
Описание слайда:
Поліморфна ієрархія класів Базовий клас class Base { public: virtual void vf() { cout<<"Base::f()"<<endl; } void g() { cout<<"Base::g()"<<endl; } };

Слайд 6





Поліморфна ієрархія класів
Похідний клас
class Derived: public Base {
public:
	virtual void vf() {
		cout<<" Derived ::f()"<<endl; }
};
Описание слайда:
Поліморфна ієрархія класів Похідний клас class Derived: public Base { public: virtual void vf() { cout<<" Derived ::f()"<<endl; } };

Слайд 7





Заміщення при пізньому зв'язуванні
void manipulator(Base & x){
	x.f();
	x.g(); }
Base b;
Derived d;
manipulator(b);	//Base::f();Base::g()
manipulator(d);	//Derived:: f();Base::g()
Описание слайда:
Заміщення при пізньому зв'язуванні 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





Накладні витрати поліморфізму
x.f();	//	виклик віртуальної функції
00401207   mov     edx,dword ptr [ebp+8]
0040120A   mov     eax,dword ptr [edx]
0040120C   mov     esi,esp
0040120E   mov      ecx,dword ptr [ebp+8]
00401211   call       dword ptr [eax]
00401213   cmp      esi,esp
00401215   call       __chkesp (00409620)
0040121A
x.g();	//	виклик невіртуальної функції 
00401700   mov         ecx,dword ptr [ebp+8]
00401703   call        @ILT+805(Base::g) (0040132a)
00401708
Описание слайда:
Накладні витрати поліморфізму x.f(); // виклик віртуальної функції 00401207 mov edx,dword ptr [ebp+8] 0040120A mov eax,dword ptr [edx] 0040120C mov esi,esp 0040120E mov ecx,dword ptr [ebp+8] 00401211 call dword ptr [eax] 00401213 cmp esi,esp 00401215 call __chkesp (00409620) 0040121A x.g(); // виклик невіртуальної функції 00401700 mov ecx,dword ptr [ebp+8] 00401703 call @ILT+805(Base::g) (0040132a) 00401708

Слайд 9





Внесення стабільного інтерфейсу
Базовий клас
class NVIBase {
public:
	void vf() { 
		dovf(); return;}
	void g() {
		cout<<"Base::g()"<<endl; }
private:
	virtual void dovf() {
		cout<<"Base::f()"<<endl; }
};
Описание слайда:
Внесення стабільного інтерфейсу Базовий клас class NVIBase { public: void vf() { dovf(); return;} void g() { cout<<"Base::g()"<<endl; } private: virtual void dovf() { cout<<"Base::f()"<<endl; } };

Слайд 10





Внесення стабільного інтерфейсу
Похідний клас
class NVIDerived: public NVIBase
{
private:
	virtual void dovf() {
		cout<<" Derived ::f()"<<endl; }
};
Описание слайда:
Внесення стабільного інтерфейсу Похідний клас class NVIDerived: public NVIBase { private: virtual void dovf() { cout<<" Derived ::f()"<<endl; } };

Слайд 11





Накладні витрати невіртуального інтерфейсу
Без особливих додаткових накладних витрат: один зайвий виклик невіртуальної інтерфейсної функції 
	x.vf();
00416E5E  mov ecx,dword ptr [x] 
00416E61  call   NVIBase::vf (415EFBh)
Описание слайда:
Накладні витрати невіртуального інтерфейсу Без особливих додаткових накладних витрат: один зайвий виклик невіртуальної інтерфейсної функції x.vf(); 00416E5E mov ecx,dword ptr [x] 00416E61 call NVIBase::vf (415EFBh)

Слайд 12





Виділення абстрактного нетермінального класу
Базовий клас
class NVINTBase {
public:
	void vf() { 
		dovf(); return;}
	void g() {
		cout<<"Base::g()"<<endl; }
     virtual ~NVINTBase()=0;
private:
	virtual void dovf() {
		cout<<"Base::f()"<<endl; }
};
Описание слайда:
Виділення абстрактного нетермінального класу Базовий клас class NVINTBase { public: void vf() { dovf(); return;} void g() { cout<<"Base::g()"<<endl; } virtual ~NVINTBase()=0; private: virtual void dovf() { cout<<"Base::f()"<<endl; } };

Слайд 13





Виділення абстрактного нетермінального класу
Похідні класи
 class NVITBase: public NVINTBase
{};
class NVITDerived: public NVINTBase {
private:
	virtual void dovf() {
		cout<<" Derived ::f()"<<endl; }
};
Описание слайда:
Виділення абстрактного нетермінального класу Похідні класи class NVITBase: public NVINTBase {}; class NVITDerived: public NVINTBase { private: virtual void dovf() { cout<<" Derived ::f()"<<endl; } };

Слайд 14





Порівняння викликів деструкторів
Виклик невіртуального деструктора 
delete nvip;
0043771D  mov         eax,dword ptr [nvip] 
00437720  mov         dword ptr [ebp-158h],eax 
00437726  mov         ecx,dword ptr [ebp-158h] 
0043772C  push        ecx  
0043772D  call        operator delete (41550Fh) 
00437732  add         esp,4
Описание слайда:
Порівняння викликів деструкторів Виклик невіртуального деструктора delete nvip; 0043771D mov eax,dword ptr [nvip] 00437720 mov dword ptr [ebp-158h],eax 00437726 mov ecx,dword ptr [ebp-158h] 0043772C push ecx 0043772D call operator delete (41550Fh) 00437732 add esp,4

Слайд 15





Порівняння викликів деструкторів
Накладні витрати віртуального деструктора 
delete pb;
00437780  mov         eax,dword ptr [pb] 
00437783  mov         dword ptr [ebp-134h],eax 
00437789  mov         ecx,dword ptr [ebp-134h] 
0043778F  mov         dword ptr [ebp-140h],ecx 
00437795  cmp         dword ptr [ebp-140h],0 
0043779C  je          main+151h (4377C1h) 
0043779E  mov         esi,esp 
004377A0  push        1    
004377A2  mov         edx,dword ptr [ebp-140h] 
004377A8  mov         eax,dword ptr [edx] 
004377AA  mov         ecx,dword ptr [ebp-140h] 
004377B0  call        dword ptr [eax] 
004377B2  cmp         esi,esp 
004377B4  call        @ILT+2795(__RTC_CheckEsp) (415AF0h) 
004377B9  mov         dword ptr [ebp-16Ch],eax 
004377BF  jmp         main+15Bh (4377CBh) 
004377C1  mov         dword ptr [ebp-16Ch],0
Описание слайда:
Порівняння викликів деструкторів Накладні витрати віртуального деструктора delete pb; 00437780 mov eax,dword ptr [pb] 00437783 mov dword ptr [ebp-134h],eax 00437789 mov ecx,dword ptr [ebp-134h] 0043778F mov dword ptr [ebp-140h],ecx 00437795 cmp dword ptr [ebp-140h],0 0043779C je main+151h (4377C1h) 0043779E mov esi,esp 004377A0 push 1 004377A2 mov edx,dword ptr [ebp-140h] 004377A8 mov eax,dword ptr [edx] 004377AA mov ecx,dword ptr [ebp-140h] 004377B0 call dword ptr [eax] 004377B2 cmp esi,esp 004377B4 call @ILT+2795(__RTC_CheckEsp) (415AF0h) 004377B9 mov dword ptr [ebp-16Ch],eax 004377BF jmp main+15Bh (4377CBh) 004377C1 mov dword ptr [ebp-16Ch],0

Слайд 16





Висновок
Повна гнучкість рішень за рахунок динамічного розпізнавання типу об'єкту при значних затратах як на етапі програмування, так і виконання
Описание слайда:
Висновок Повна гнучкість рішень за рахунок динамічного розпізнавання типу об'єкту при значних затратах як на етапі програмування, так і виконання

Слайд 17





“Невіртуальна” ієрархія
class Base {
public:
	void f() {cout<<"Base::f()"<<endl; }
	void g() {cout<<"Base::g()"<<endl; }
};
class Derived : public Base {
public:
	void f() {cout<<" Derived::f()"<<endl; }
//	пряме відсилання до базового класу
	void g() {Base::g();}
};
Описание слайда:
“Невіртуальна” ієрархія class Base { public: void f() {cout<<"Base::f()"<<endl; } void g() {cout<<"Base::g()"<<endl; } }; class Derived : public Base { public: void f() {cout<<" Derived::f()"<<endl; } // пряме відсилання до базового класу void g() {Base::g();} };

Слайд 18





Раннє зв'язування
void manipulator(Base & x){
	x.f();
	x.g(); }
Base b;
Derived d;
manipulator(b);	//Base::f();Base::g()
manipulator(d);	// Base::f();Base::g()
Описание слайда:
Раннє зв'язування 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





Висновок
Раннє зв'язування не забезпечує заміщень: при підстановці параметром об'єкту похідного класу викликаються функції базового
Описание слайда:
Висновок Раннє зв'язування не забезпечує заміщень: при підстановці параметром об'єкту похідного класу викликаються функції базового

Слайд 20





Узагальнений маніпулятор ієрархією класів
template <typename T>
void manipulator(T & x){
	x.f();
	x.g(); }
Base b;
Derived d;
manipulator(b);	//Base::f();Base::g()
manipulator(d);	//Derived:: f();Base::g()
Описание слайда:
Узагальнений маніпулятор ієрархією класів template <typename T> 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





Висновок
Шаблон, застосований до ієрархії, доповненої явним делегуванням, моделює статичний поліморфізм
Описание слайда:
Висновок Шаблон, застосований до ієрархії, доповненої явним делегуванням, моделює статичний поліморфізм

Слайд 22





“На городі бузина...”
class ElderBerry		// бузина
{
public:
	void f(char a='!', double x=1, bool t=true) 
	{
		cout<<"ElderBerry::f()"<<endl; 
	}
	void g(char a='?') 
	{
		cout<<"ElderBerry::g()"<<endl; 
	}
	void goToUncle();	// у Києві
};
Описание слайда:
“На городі бузина...” class ElderBerry // бузина { public: void f(char a='!', double x=1, bool t=true) { cout<<"ElderBerry::f()"<<endl; } void g(char a='?') { cout<<"ElderBerry::g()"<<endl; } void goToUncle(); // у Києві };

Слайд 23





А де Murgatroyd? 
class Murgatroyd {
public:
	void f() {
		cout<<"Murgatroyd::f()"<<endl; 
	}
	void g(ElderBerry & ga=ElderBerry(),
 			double a=3.14) {
		cout<<" ElderBerry::g()"<<endl;
               ga.g();
	}
//	An exclamation of surprise 
	int heavensTo(const Murgatroyd &);
};
Описание слайда:
А де Murgatroyd? class Murgatroyd { public: void f() { cout<<"Murgatroyd::f()"<<endl; } void g(ElderBerry & ga=ElderBerry(), double a=3.14) { cout<<" ElderBerry::g()"<<endl; ga.g(); } // An exclamation of surprise int heavensTo(const Murgatroyd &); };

Слайд 24





Узагальнена функція
template <class T>
void manipulator(T & x){
	x.f();
	x.g(); }
ElderBerry u;
Murgatroyd v;
manipulator(u); // ElderBerry::f(), ElderBerry:: g()
manipulator(v);	// Murgatroyd ::f(), ElderBerry:: g()
Описание слайда:
Узагальнена функція template <class T> 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





Поліморфізм без ієрархії
Методи узагальненого програмування дозволяють промоделювати статичний поліморфізм не застосовуючи ієрархії класів, а лише їх знайомств за умови узгодженості їх поведінки
Описание слайда:
Поліморфізм без ієрархії Методи узагальненого програмування дозволяють промоделювати статичний поліморфізм не застосовуючи ієрархії класів, а лише їх знайомств за умови узгодженості їх поведінки

Слайд 26





Висновок
Кожен початківець хоче продемонструвати володіння успадкуванням (90% випадків)
Віртуальні функції найчастіше вживаються некоректно
Застосовувати динамічний поліморфізм варто лише тоді, коли статичного не вистачає
Узагальнене програмування найпотужніший механізм статичного поліморфізму, але...
Описание слайда:
Висновок Кожен початківець хоче продемонструвати володіння успадкуванням (90% випадків) Віртуальні функції найчастіше вживаються некоректно Застосовувати динамічний поліморфізм варто лише тоді, коли статичного не вистачає Узагальнене програмування найпотужніший механізм статичного поліморфізму, але...

Слайд 27





Безпечність узагальненого програмування
Наперед невідомо, який саме тип буде підставлено до шаблону: як гарантувати працездатність за мінімальних вимог до типового параметру? Як уникнути збоїв на етапі виконання?
Описание слайда:
Безпечність узагальненого програмування Наперед невідомо, який саме тип буде підставлено до шаблону: як гарантувати працездатність за мінімальних вимог до типового параметру? Як уникнути збоїв на етапі виконання?

Слайд 28





Синтаксичний контроль типів
Успадкування типів
Зведення типів
Примітивність типів
Індексованість типів
Описание слайда:
Синтаксичний контроль типів Успадкування типів Зведення типів Примітивність типів Індексованість типів

Слайд 29





Типізація (за Бучем)
Засіб захисту від використання об’єктів одного класу замість іншого, або принаймні спосіб управління цим використанням.
Описание слайда:
Типізація (за Бучем) Засіб захисту від використання об’єктів одного класу замість іншого, або принаймні спосіб управління цим використанням.

Слайд 30





Шаблон з одним параметром
Пробуємо розмістити значення
Того ж типу Т на новому місці
template <class T>
void construct( T*& p, const T& value )
{
	p =new T(value);
	return;
}
Описание слайда:
Шаблон з одним параметром Пробуємо розмістити значення Того ж типу Т на новому місці template <class T> void construct( T*& p, const T& value ) { p =new T(value); return; }

Слайд 31





Застосування шаблону
void converted( double*& p1, Base* p2 ) {
	Base b;
	Derived d;
	construct( p1, 2.718 ); 
  	construct( p2, b );
	construct( p1, 42 ); 
	construct<double>( p1, 42 );
	
	construct( p2, d ); 
	construct<Base>( p2, d );
}
Описание слайда:
Застосування шаблону void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, 2.718 ); construct( p2, b ); construct( p1, 42 ); construct<double>( p1, 42 ); construct( p2, d ); construct<Base>( p2, d ); }

Слайд 32





Результати першої спроби
void converted( double*& p1, Base* p2 ) {
	Base b;
	Derived d;
	construct( p1, 2.718 ); 
  	construct( p2, b );
//	construct( p1, 42 ); 42 is int 
	construct<double>( p1, 42 );
	
//	construct( p2, d ); d is Derived
	construct<Base>( p2, d );
}
Описание слайда:
Результати першої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, 2.718 ); construct( p2, b ); // construct( p1, 42 ); 42 is int construct<double>( p1, 42 ); // construct( p2, d ); d is Derived construct<Base>( p2, d ); }

Слайд 33





Висновок
(з першої спроби)
Надто жорстка умова на типовий параметр
Описание слайда:
Висновок (з першої спроби) Надто жорстка умова на типовий параметр

Слайд 34





Шаблон з двома параметрами
Пробуємо розмістити значення типу Т2 
на новому місці за указником типу Т1
Як уникнути недопустимих комбінацій типів
template <class T1, class T2>
void construct( T1*& p, const T2& value )
{
	p =new T2(value);
	return;
}
Описание слайда:
Шаблон з двома параметрами Пробуємо розмістити значення типу Т2 на новому місці за указником типу Т1 Як уникнути недопустимих комбінацій типів template <class T1, class T2> void construct( T1*& p, const T2& value ) { p =new T2(value); return; }

Слайд 35





Обмеження на успадкування 
template <class Base, class Derived>
struct must_have_base
{
	~must_have_base()
	{
		void (*p)(Derived*, Base*) = constraints;
	}
private:
	static void constraints(Derived* pd, Base* pb)
	{
		pb=pd;
	}
};
Описание слайда:
Обмеження на успадкування template <class Base, class Derived> struct must_have_base { ~must_have_base() { void (*p)(Derived*, Base*) = constraints; } private: static void constraints(Derived* pd, Base* pb) { pb=pd; } };

Слайд 36





Шаблон, доповнений перевіркою підтипів
Спроба використати недопустиму
комбінацію типів діагностується компілятором
template <class T1, class T2>
void construct( T1*& p, const T2& value )
{
	must_have_base<T1, T2> check;
	p =new T2(value);
	return;
}
Описание слайда:
Шаблон, доповнений перевіркою підтипів Спроба використати недопустиму комбінацію типів діагностується компілятором template <class T1, class T2> void construct( T1*& p, const T2& value ) { must_have_base<T1, T2> check; p =new T2(value); return; }

Слайд 37





Результати другої спроби
void converted( double*& p1, Base* p2 ) {
	Base b;
	Derived d;
	construct( p1, 2.718 ); 
  	construct( p2, b );
//	construct( p1, 42 ); 42 is int 
//	construct<double>( p1, 42 ); не підтип
	
	construct( p2, d ); // ОК d is Derived
	construct<Base>( p2, d );
}
Описание слайда:
Результати другої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, 2.718 ); construct( p2, b ); // construct( p1, 42 ); 42 is int // construct<double>( p1, 42 ); не підтип construct( p2, d ); // ОК d is Derived construct<Base>( p2, d ); }

Слайд 38





Обмеження на зводимість
template <class Type, class Convert>
struct must_be_converted
{
	~must_be_converted()
	{
		void (*p)(Type &, const Convert &) =
			 constraints;
	}
private:
	static void constraints(Type & s, const Convert & t)
	{
		s=t; }
};
Описание слайда:
Обмеження на зводимість template <class Type, class Convert> 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





Шаблон, доповнений перевіркою зведення типів
Спроба використати недопустиму
комбінацію типів діагностується компілятором
template <class T1, class T2>
void construct( T1*& p, const T2& value )
{
	must_be_converted<T1, T2> check;
	p =new T2(value);
	return;
}
Описание слайда:
Шаблон, доповнений перевіркою зведення типів Спроба використати недопустиму комбінацію типів діагностується компілятором template <class T1, class T2> void construct( T1*& p, const T2& value ) { must_be_converted<T1, T2> check; p =new T2(value); return; }

Слайд 40





Результати третьої спроби
void converted( double*& p1, Base* p2 ) {
	Base b;
	Derived d;
	construct( p1, 2.718 ); 
  	construct( p2, b );
	construct( p1, 42 ); // ОК 42 converted to double
	construct<double>( p1, 42 ); 
	
	construct( p2, d ); // ОК d is Derived
	construct<Base>( p2, d );
}
Описание слайда:
Результати третьої спроби void converted( double*& p1, Base* p2 ) { Base b; Derived d; construct( p1, 2.718 ); construct( p2, b ); construct( p1, 42 ); // ОК 42 converted to double construct<double>( p1, 42 ); construct( p2, d ); // ОК d is Derived construct<Base>( p2, d ); }

Слайд 41





Перевірка примітивності типу
template <class T>
struct must_be_POD
{
	~must_be_POD()
	{
		void (*p)() = constraints;
	}
private:
	static void constraints() {
		union{
			T T_is_not_POD_type;};
	}
};
Описание слайда:
Перевірка примітивності типу template <class T> struct must_be_POD { ~must_be_POD() { void (*p)() = constraints; } private: static void constraints() { union{ T T_is_not_POD_type;}; } };

Слайд 42





Приклади інших перевірок
Описание слайда:
Приклади інших перевірок

Слайд 43





Перевірка індексованості
template <class T>
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]);
	}
};
Описание слайда:
Перевірка індексованості template <class T> 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





Перевірка розмірностей
template <class T1, class T2>
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];
	}
};
Описание слайда:
Перевірка розмірностей template <class T1, class T2> 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





Висновок
Збалансовуйте застосування успадкувань і шаблонів
Зважено контролюйте типи, але не вимагайте від них більше, ніж потрібно
Описание слайда:
Висновок Збалансовуйте застосування успадкувань і шаблонів Зважено контролюйте типи, але не вимагайте від них більше, ніж потрібно



Похожие презентации
Mypresentation.ru
Загрузить презентацию