Void main(). a->Display(); // використання функції A::Display()
{
A * a = new A;
B * b = new B;
a->Display(); // використання функції A::Display()
b->Display(); // використання функції B::Display()
show(a); // використання функції A::Display()
show(b); // використання функції B::Display()
delete a,b;
}
Поліморфне поводження функції Display() у класах А та В не очевидно, якщо розглядати тільки функцію main(). Воно розглядається тільки у функції show(), у котрій неможливо знати, яка саме функція A->Display() або В->Display() буде викликатися. Якби не було слова virtual, то робота коду виглядала б таким чином:
show(a); // використання A::Display()
show(b); // використання A::Display()
У цьому випадку звертання до функції призводить до виклику A::Display().
Оголошення функції віртуальною не означає, що вона обов’язково буде перевизначатися в похідному класі. Щоб поширити поліморфне поводження функції униз по дереву спадкування, кожний похідний клас повинен оголосити ту саму функцію віртуальною.
У попередньому прикладі віртуальна функція В::Display() викликалася динамічно під час виконання функції show(). Отже, функція В::Display(), так сказати, віртуально перевизначила функцію А::Display().
Функція, оголошена в похідному класі перевизначає функцію в базовому класі тільки тоді, коли має те ж ім’я і працює з тією ж кількістю і типом аргументів, що і віртуальна функція базового класу. Якщо вони відрізняються хоча б одним аргументом, то функція в похідному класі є цілком новою і перевизначена не буде. Розглянемо дерево спадкування на рис. 4.1.
Рис. 4.1. Дерево спадкування
Дереву спадкування на рис.4.1. відповідає такий код:
Дата добавления: 2014-12-26; просмотров: 812;