Абстрактні базові класи - студопедія

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 () // відкладений метод для FOX

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 () // відкладений метод для RABBIT

living * next (world w); // відкладений метод для RABBIT

// поточний клас - тільки рослини

class grass: public living

grass (int r, int c): living (r, c) <>

state who () // відкладений метод для GRASS

living * next (world w); // відкладений метод для GRASS

class empty: public living

empty (int r, int c): living (r, c) <>

state who () // відкладений метод для EMPTY

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 буде з'їдена.

Схожі статті