МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Контрольні запитання та завданняПриклад 4 Приклад 3 //Ієрархічний порядок віртуальних функцій class base { public: int i; base (int x) {i = x;} virtual void func () { cout <<" Виконання функції func () базовою класу: “ cout << i << ‘\ n’; } } class derived1: public base { public: derived1 (int x): base (x) {} voidfunc () { cout <<"Виконання функції func () класу derivedl: “ cout << i * i << “\n”; } }; class derived2: public base { public: derived2 (int x): base (x) {} //У класі derived2 функція func () не підмінюється }; void main () { base * p; base ob (10); derivedl d_obl (10); derived2 d_ob2 (10); p = &ob; p‑> func {); //функція func () базового класу р = & d_obl; p‑> func (); //функція func () похідного класу derivedl р = & d_ob2; p‑> func (); //функція func () базового класу }
Після виконання програми на екран виводиться наступне: Виконання функції func () базового класу: 10 Виконання функції func () класу derivedl: 100 Виконання функції func () базового класу: 10
У цьому прикладі в класі derived2 функція func () не підмінюється. Коли вказівником р присвоюється адреса об’єкту d_ob2 і викликається функція func (), використовується версія функції з класу base, оскільки вона наступна у ієрархіі класів. Зазвичай, якщо віртуальна функція не перевизначена в похідному класі, використовується її версія з базового класу.
У наступному прикладі створюється вихідний базовий клас area, в якому зберігаються два розміри фігури. У ньому також оголошується віртуальна функція getarea (), яка, при її підміні у похідному класі, повертає площу фігури, вигляд якої задається в похідному класі. У цьому випадку визначення функції getarea () всередині базового класу задає інтерфейс. Конкретна реалізація залишається тим класам, які успадковують клас area. У цьому прикладі розраховується площа трикутника і прямокутника. //Використання віртуальної функції для визначення інтерфейсу class area { double diml, dim2; //розміри фігури public: void setarea (double dl, double 62) { diml = dl; dim2 = d2; } void getdim (double &dl, double &d2) { dl = diml; d2 = dim2; } virtual double getarea () { cout <<"Необхідно підмінити цю функцію \n”; return 0.0; } }; class rectangle: public area { public: double getarea () { double dl, d2; getdim (d1, d2); return dl * d2; } }; class triangle: public area { public: double getarea () { double dl, d2; getdim (dl, d2); return 0.5 * d1 * d2; } ); void main () { area * p; rectangle r; triangle t; r.setarea (3.3, 4.5); t.setarea (4.0, 5.0); Р = &r; cout <<" Площа прямокутника: “ << P‑> getarea () <<‘\ n’; р = &t; cout <<" Площа трикутника: “ << P‑> getarea () << “\n”; }
1. Що таке віртуальна функція? 2. Які функції не можуть бути віртуальними? 3. Як віртуальні функції допомагають реалізовувати динамічний поліморфізм? 4. Чи є правильним наступний фрагмент? Якщо ні, то чому? class base { public: virtual int f (int a) = 0; //… };
class derived: public base { public: int f(int a, int b) {return a * b;} //… }; 5. Чи успадковується віртуальність? 6. Що відрізняє віртуальні функції від перевантажених функцій?
Читайте також:
|
||||||||
|