virtual прототип функції = 0;
Чистий віртуальна функція використовується для того, щоб "відкласти" рішення про реалізацію функції. В ООП термінології це називається відстроченим методом.
Пояснимо цю концепцію за допомогою розробки примітивної форми екологічного моделювання. У нашому прикладі будемо мати різні форми взаємодії життя з використанням абстрактного базового класу living. Створимо fox (лисицю) як типового хижака, і rabbit (кролика) як його жертву. Rabbit є grass (траву).
const int N = 40, STATES = 4; // розмір квадратної площі
typedef living * world [N] [N]; // world буде моделлю
class living
int row, column; // розташування
void sums (world, int sm []); // sm [#states] використовується next
living (int r, int c): row (r), column (c) <>
virtual state who () = 0; // ідентифікація станів
virtual living * next (world w) = 0; // розрахунок next
void living :: sums (world w, int sm [])
for (int i = -1; i <= 1; i++)
for (int j = -1; j <= 1; j++) sm[w[row+i][column+j]->who ()] ++;
// поточний клас - тільки хижаки
class fox: public living
int age; // використовується для прийняття рішення про смерть
fox (int r, int c, int a = 0): living (r, c), age (a) <>
state who ()
living * next (world w); // відкладений метод для FOX
// поточний клас - тільки жертви
class rabbit: public living
int age; // використовується для прийняття рішення про смерть
rabbit (int r, int c, int a = 0): living (r, c), age (a) <>
state who ()
living * next (world w); // відкладений метод для RABBIT
// поточний клас - тільки рослини
class grass: public living
grass (int r, int c): living (r, c) <>
state who ()
living * next (world w); // відкладений метод для GRASS
class empty: public living
empty (int r, int c): living (r, c) <>
state who ()
living * next (world w); // відкладений метод для EMPTY
Зверніть увагу на те, що проект дозволяє розвивати і інші форми хижака, жертви і рослинного життя, використовуючи наступний рівень успадкування. Характеристики поведінки кожної форми життя фіксується в версії next ().
Living * grass :: next (world w)
if (sum [GRASS]> sum [RABBIT) // їсти траву
return (new grass (row, column));
return (new empty (row, column));
Grass може бути з'їдений Rabbit. Якщо в околиці є більше grass, ніж rabbit, grass залишається, інакше - grass буде з'їдена.