Новости

Фотки
Надписи на партах
Под гармошку
Обои для рабочего стола

Downloads
Компьютерные магазины
Фуфло

ЕЯС
НКС
ООП
СЦОД

Гостевая

Я ВКонтакте

Объектно-ориентированное программирование

Урок №5. Немного о виртуальных функциях.

Наверное все понимают, для чего нужны виртуальные функции. Если не все, то объясню. Например, пусть дан некоторый класс Sobaka, и куча наследников от него, в несколько поколений.

Sobaka
 |
 |------SluzhebnayaSobaka
 |       |
 |       |------Doberman
 |       |
 |       |------Ovcharka
 |               |
 |               |------SredneaziatskayaOvcharka
 |               |
 |               |------KavkazskayaOvcharka
 |
 |------DecorativnayaSobaka
 |       |
 |       |------Pudel
 |       |       |
 |       |       |------KarlikoviyPudel
 |       |
 |       |------Bolonka
 |       |
 |       |------Pekines
 |
 |------DikayaSobaka
         |
         |------Dingo

Пусть в каждом классе будет описана функция show(), которая будет изображать эту собаку на экране. Для каждого класса - функция будет своя.

Так вот, если мы объявим массив указателей на класс Sobaka:

Sobaka * sob[100];

А затем каждому указателю присвоим динамически созданный экземпляр случайного класса:

for (int i=0; i<100; i++)
  switch (random (13)) {
    case 0:  sob[i]= new Sobaka();  break;
    case 1:  sob[i]= new SluzhebnayaSobaka();  break;
    case 2:  sob[i]= new Doberman();  break;
    ...
    case 11:  sob[i]= new DikayaSobaka();  break;
    case 12:  sob[i]= new Dingo();  break;
  }

То при следующей конструкции:

for (int i=0; i<100; i++)
  sob[i] -> show();

будет 100 раз вызвана функция show(), которая описана в классе Sobaka.

НО!!!

Но это В ТОМ случае, если функция show() будет НЕвиртуальной.

А если же функция show() будет являться виртуальной, то тогда для каждого экземпляра класса - по указателю sob[i] - будет вызвана именно та функция show(), которая описана в классе наследнике. И совершенно не важно, что указатель sob[i] имеет тип "указатель на Sobaka".

sob[4]= new Bolonka();
sob[4]->show(); // вызывается функция show() из класса Bolonka

Виртуальные функции можно применять в различных играх. Классический пример - "Танчики". Можно сделать кучу наследников от базового класса Tank. Затем все вражеские танки загнать в один массив (Tank *vt[100]). Cами танки могут обладать разными свойствами, например: по разному изображаться, по разному передвигаться, стрелять разными снарядами. Поэтому соответствующие функции show(), move(), fire() - можно сделать виртуальными и вызывать их из указателя на базовый класс: vt[i]->show(), vt[i]->move(), vt[i]->fire(). И, как вы уже надеюсь поняли, для различных типов танков будут вызваны различные функции.


Урок №1. Перемещение объекта.

Урок №2. Игра "Арканоид".

Урок №3. Обработка нажатий клавиш.

Урок №4. Системный таймер.

Урок №5. Немного о виртуальных функциях.

^^ наверх ^^

Дизайн: Красиков Виктор, kv630@mail.ru, ICQ - 319227
Местонахождение: Россия, респ. Бурятия, г. Улан-Удэ
Время на сервере: 27.02.21 06:20
Время в Улан-Удэ: 27.02.21 11:20
Время генерации страницы 0.00446 сек.