Тема : Абстрактні та віртуальні класи, віртуальні методи, віртуальний деструктор.
Зв'язування - це співставлення виклику функції з тілом. Для звичайних методів зв'язування виконується на етапі трансляції до запуску програми. Таке зв'язування називають "раннім" або статичним. При успадкування звичайного методу його поведінка не змінюється в нащадку. Але, буває необхідно, щоб поведінка деяких методів базавого класу і класів-нащадків відрізнялись. Щоб досягти різної поведінки в залежності від типу, необхідно оголосити функцію-метод віртуальною; в С++ це робиться за допомогою ключового клова virtual. Віртуальні функції разом з припципом підстановки забезпечують механізм "пізнього" (відкладеного) або динамічногозв'язування, яке працює під час виконання програми.
Часто механізм роботи віртуальних функцій плутають з механізмом перевизначення функцій в нащадках. Для того, щоб розібратися в чому ж різниця між перевизначеними і віртуальними методами, розглянемо простий приклад, попередньо розбивши його на кроки.
Опишемо базовий клас Base, в якому є функція print(), яка виводить повідомлення на екран, що працює функція базового класу. Успадкуємо клас Base в класі Derive. Зрозуміло, що функція print() успадкується з базового класу і працюватиме так само як і в ньому.
#include <iostream.h>
#include <conio.h>
class Base // базовий клас
{
public:
void print();
};
void Base::print()
{
cout<<endl<<"Base-print"<<endl; // базовий метод
}
class Derive:public Base // похідний клас
{
};
int main(int argc, char* argv[])
{
Base X; // об'єкт базового класу
Derive Y; // об'єкт похідного класу
X.print(); // виклик базового методу
Y.print(); // виклик базового методу
getch();
return 0;
}