🗊Презентация Виртуальные функции и полиморфизм

Нажмите для полного просмотра!
Виртуальные функции и полиморфизм, слайд №1Виртуальные функции и полиморфизм, слайд №2Виртуальные функции и полиморфизм, слайд №3Виртуальные функции и полиморфизм, слайд №4Виртуальные функции и полиморфизм, слайд №5Виртуальные функции и полиморфизм, слайд №6Виртуальные функции и полиморфизм, слайд №7Виртуальные функции и полиморфизм, слайд №8Виртуальные функции и полиморфизм, слайд №9Виртуальные функции и полиморфизм, слайд №10Виртуальные функции и полиморфизм, слайд №11Виртуальные функции и полиморфизм, слайд №12Виртуальные функции и полиморфизм, слайд №13

Вы можете ознакомиться и скачать презентацию на тему Виртуальные функции и полиморфизм. Доклад-сообщение содержит 13 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

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


Слайд 1





Виртуальные функции и полиморфизм
Описание слайда:
Виртуальные функции и полиморфизм

Слайд 2





Виртуальные функции
Функция-член, объявленная в базовом классе и переопределенная в производном
То есть виртуальный означает видимый, но не существующий в реальности
Программа, которая, казалось бы, вызывает функцию одного класса, может вызывать функцию совсем другого класса
Описание слайда:
Виртуальные функции Функция-член, объявленная в базовом классе и переопределенная в производном То есть виртуальный означает видимый, но не существующий в реальности Программа, которая, казалось бы, вызывает функцию одного класса, может вызывать функцию совсем другого класса

Слайд 3





деструктры
Могут объявляться как virtual. Используя виртуальные деструкторы, можно уничтожать объекты, не зная их тип — правильный деструктор для объекта вызывается с помощью механизма виртуальных функций. Обратите внимание, что для абстрактных классов деструкторы также могут объявляться как чисто виртуальные функции.
Описание слайда:
деструктры Могут объявляться как virtual. Используя виртуальные деструкторы, можно уничтожать объекты, не зная их тип — правильный деструктор для объекта вызывается с помощью механизма виртуальных функций. Обратите внимание, что для абстрактных классов деструкторы также могут объявляться как чисто виртуальные функции.

Слайд 4





Зачем нужны виртуальные функции
Пусть имеется набор объектов разных классов
Например, есть разные геометрические фигуры: треугольник, шар и квадрат. В каждом классе есть метод draw(), который прорисовывает на экране соответствующие фигуры
Задача: нарисовать картинку, сгруппировав эти элементы, без дополнительных сложностей
Решение: создать массив указателей на все неповторяющиеся элементы картинки, т.е. указатель на объект шарик, указатель на квадрат и т.п.
Обращаясь к разным элементам массива можно рисовать разные фигуры
Описание слайда:
Зачем нужны виртуальные функции Пусть имеется набор объектов разных классов Например, есть разные геометрические фигуры: треугольник, шар и квадрат. В каждом классе есть метод draw(), который прорисовывает на экране соответствующие фигуры Задача: нарисовать картинку, сгруппировав эти элементы, без дополнительных сложностей Решение: создать массив указателей на все неповторяющиеся элементы картинки, т.е. указатель на объект шарик, указатель на квадрат и т.п. Обращаясь к разным элементам массива можно рисовать разные фигуры

Слайд 5





Причем здесь полиморфизм 
То есть имеем «один интерфейс (функции называются одинаково draw()) и несколько методов (реально вызываются разные функции, рисующие разные фигуры)»
Это есть – полиморфизм
Перегрузка функций – статический полиморфизм
Наследование и виртуальные функции – динамический полиморфизм
Описание слайда:
Причем здесь полиморфизм То есть имеем «один интерфейс (функции называются одинаково draw()) и несколько методов (реально вызываются разные функции, рисующие разные фигуры)» Это есть – полиморфизм Перегрузка функций – статический полиморфизм Наследование и виртуальные функции – динамический полиморфизм

Слайд 6





Как создаются виртуальные функции
В базовом классе перед объявлением виртуальной функции указывается ключевое слово: virtual
В производном классе функция переопределяется – то есть создается конкретная реализация функции
Для примера рассмотренного выше:
Все классы (шар, треугольник, квадрат) должны быть наследниками одного и того же базового класса
Функция draw() должна быть объявлена как virtual
Описание слайда:
Как создаются виртуальные функции В базовом классе перед объявлением виртуальной функции указывается ключевое слово: virtual В производном классе функция переопределяется – то есть создается конкретная реализация функции Для примера рассмотренного выше: Все классы (шар, треугольник, квадрат) должны быть наследниками одного и того же базового класса Функция draw() должна быть объявлена как virtual

Слайд 7





Доступ к обычным методам через указатели: базовый и производные классы содержат функции с одним и тем же именем, к ним обращаются с помощью указателей, но без виртуальных функций
class base
{
public:
	void show() { cout <<“Base \n”;}
};
Class Derv1:public Base
{
	void show() { cout <<“Derv1\n”;}
};
Class Derv2:public Base
{
	void show() { cout <<“Derv2\n”;}
};
void main ()
{
	Derv1 dv1;
	Derv2 dv2;
	Base* ptr;
	ptr = &dv1;
	ptr ->show();
	ptr = &dv2;
	ptr ->show();
}
Вывод: ?
Описание слайда:
Доступ к обычным методам через указатели: базовый и производные классы содержат функции с одним и тем же именем, к ним обращаются с помощью указателей, но без виртуальных функций class base { public: void show() { cout <<“Base \n”;} }; Class Derv1:public Base { void show() { cout <<“Derv1\n”;} }; Class Derv2:public Base { void show() { cout <<“Derv2\n”;} }; void main () { Derv1 dv1; Derv2 dv2; Base* ptr; ptr = &dv1; ptr ->show(); ptr = &dv2; ptr ->show(); } Вывод: ?

Слайд 8





Доступ к виртуальным методам через указатели
class base
{
public:
	virtual void show() { cout <<“Base \n”;}
};
Class Derv1:public Base
{
	void show() { cout <<“Derv1\n”;}
};
Class Derv2:public Base
{
	void show() { cout <<“Derv2\n”;}
};
void main ()
{
	Derv1 dv1;
	Derv2 dv2;
	Base* ptr;
	ptr = &dv1;
	ptr ->show();
	ptr = &dv2;
	ptr ->show();
}
Вывод: ?
Описание слайда:
Доступ к виртуальным методам через указатели class base { public: virtual void show() { cout <<“Base \n”;} }; Class Derv1:public Base { void show() { cout <<“Derv1\n”;} }; Class Derv2:public Base { void show() { cout <<“Derv2\n”;} }; void main () { Derv1 dv1; Derv2 dv2; Base* ptr; ptr = &dv1; ptr ->show(); ptr = &dv2; ptr ->show(); } Вывод: ?

Слайд 9





Позднее или динамическое связывание
Какая функция компилируется при компиляции выражения:
 ptr ->show(); ?
Всегда компилируется функция из базового класса
Однако в последней программе компилятор не знает к какому классу относится содержимое ptr.
Когда программа поставлена на выполнение, когда известно, на что указывает ptr, тогда запускается соответствующая версия  show().
Выбор функции во время компиляции называется ранним или статическим связыванием
Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях и гибкости
Описание слайда:
Позднее или динамическое связывание Какая функция компилируется при компиляции выражения: ptr ->show(); ? Всегда компилируется функция из базового класса Однако в последней программе компилятор не знает к какому классу относится содержимое ptr. Когда программа поставлена на выполнение, когда известно, на что указывает ptr, тогда запускается соответствующая версия show(). Выбор функции во время компиляции называется ранним или статическим связыванием Позднее связывание требует больше ресурсов, но дает выигрыш в возможностях и гибкости

Слайд 10





Пример
class B{
int a;
public:
B() { };
B(int x) { a=x; }
void show_B() { cout<<"B=   "<< a <<"\n"; }
virtual void showV_B() { cout<<"virt B=   "<< a <<"\n"; }
};
class D1: public B {
int b;
public:
D1(int x, int y) : B(y) { b=x;};
void show_D1() { cout<<"D1=  "<< b <<"\n"; show_B();}
void showV_B() { cout<<"virt D1=   "<< b <<"\n"; }
};
class D2: public B{
int c;
public:
D2(int x, int y) : B(y) { c=x;};
void show_D2() { cout<<"D2=  "<< c <<"\n"; show_B();}
void showV_B() { cout<<"virt D2=   "<< c <<"\n"; }
};
class D3: public D1 {
int d;
public:
D3(int x, int y, int z) : D1(y,z) { d=x;}
void show_D3() { cout<<"D3=  "<<d <<"\n"; show_D1();}
void showV_B() { cout<<"virt D3=   "<< d <<"\n"; }
};
class D4: public D2, public D1 {
int e;
public:
D4(int x, int y, int z, int i, int j) : D1(y,z), D2(i,j) { e=x;}
void show_D4() { cout<<"D4=  "<< e <<"\n"; show_D1(); show_D2();}
void showV_B() { cout<<"virt D4=   "<< e <<"\n"; }
};
int main() {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
B objB(100);
D1 objD1(200,200);
D2 objD2(300,300);
D3 objD3(1,2,3);
D4 objD4(10,20,30,40,50);
cout<<"B objB(100);\n";
cout<<"D1 objD1(200,200);\n";
cout<<"D2 objD2(300,300);\n";
cout<<"D3 objD3(1,2,3,4,5);\n";
cout<<"D4 objD4(10,20,30,40,50);\n";
cout<<"\nСледуя иерархии класса D3: \n";
objD3.show_D3();
cout<<"\nСледуя иерархии класса D4\n";
objD4.show_D4();
B *p[5];
p[0]=&objB;
p[1]=&objD1;
p[2]=&objD2;
p[3]=&objD3;
//p[4]=&objD4;
cout<<"\n Работа виртуальных функций \n";
for (int i=0; i<4;i++)
p[i]->showV_B();
getch();
return 0;
}
Описание слайда:
Пример class B{ int a; public: B() { }; B(int x) { a=x; } void show_B() { cout<<"B= "<< a <<"\n"; } virtual void showV_B() { cout<<"virt B= "<< a <<"\n"; } }; class D1: public B { int b; public: D1(int x, int y) : B(y) { b=x;}; void show_D1() { cout<<"D1= "<< b <<"\n"; show_B();} void showV_B() { cout<<"virt D1= "<< b <<"\n"; } }; class D2: public B{ int c; public: D2(int x, int y) : B(y) { c=x;}; void show_D2() { cout<<"D2= "<< c <<"\n"; show_B();} void showV_B() { cout<<"virt D2= "<< c <<"\n"; } }; class D3: public D1 { int d; public: D3(int x, int y, int z) : D1(y,z) { d=x;} void show_D3() { cout<<"D3= "<<d <<"\n"; show_D1();} void showV_B() { cout<<"virt D3= "<< d <<"\n"; } }; class D4: public D2, public D1 { int e; public: D4(int x, int y, int z, int i, int j) : D1(y,z), D2(i,j) { e=x;} void show_D4() { cout<<"D4= "<< e <<"\n"; show_D1(); show_D2();} void showV_B() { cout<<"virt D4= "<< e <<"\n"; } }; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); B objB(100); D1 objD1(200,200); D2 objD2(300,300); D3 objD3(1,2,3); D4 objD4(10,20,30,40,50); cout<<"B objB(100);\n"; cout<<"D1 objD1(200,200);\n"; cout<<"D2 objD2(300,300);\n"; cout<<"D3 objD3(1,2,3,4,5);\n"; cout<<"D4 objD4(10,20,30,40,50);\n"; cout<<"\nСледуя иерархии класса D3: \n"; objD3.show_D3(); cout<<"\nСледуя иерархии класса D4\n"; objD4.show_D4(); B *p[5]; p[0]=&objB; p[1]=&objD1; p[2]=&objD2; p[3]=&objD3; //p[4]=&objD4; cout<<"\n Работа виртуальных функций \n"; for (int i=0; i<4;i++) p[i]->showV_B(); getch(); return 0; }

Слайд 11





Чисто виртуальные функции
Описание слайда:
Чисто виртуальные функции

Слайд 12





Задание
Создайте программу, реализущую кошелек, используя виртуальные функции
Помните:
Виртуальные функции позволяют решать прямо в процессе выполнения программы, какую именно функцию вызывать
 Виртуальные функции дают большую гибкость при выполнении одинаковых действий над разнородными объектами
Описание слайда:
Задание Создайте программу, реализущую кошелек, используя виртуальные функции Помните: Виртуальные функции позволяют решать прямо в процессе выполнения программы, какую именно функцию вызывать Виртуальные функции дают большую гибкость при выполнении одинаковых действий над разнородными объектами

Слайд 13





Работа в малых группах
Создайте программу имитирующую работу калькулятора, выполняющего четыре арифметических действия над дробями. Например,
Сложение: a/b + c/d = (a*d+b*c)/(b*d)
Вычитание: a/b - c/d = (a*d-b*c)/(b*d)
Умножение: a/b * c/d = (a*c)/(b*d)
Деление: a/b / c/d = (a*d)/(b*c)
Пользователь должен сначала ввести первый операнд, затем знак операции и второй операнд. После вычисления результата программа должна отобразить его на экране и запросить пользователя о его желании произвести еще одну операцию.
Описание слайда:
Работа в малых группах Создайте программу имитирующую работу калькулятора, выполняющего четыре арифметических действия над дробями. Например, Сложение: a/b + c/d = (a*d+b*c)/(b*d) Вычитание: a/b - c/d = (a*d-b*c)/(b*d) Умножение: a/b * c/d = (a*c)/(b*d) Деление: a/b / c/d = (a*d)/(b*c) Пользователь должен сначала ввести первый операнд, затем знак операции и второй операнд. После вычисления результата программа должна отобразить его на экране и запросить пользователя о его желании произвести еще одну операцию.



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