Виртуелни методи¶
Након примера са класама Pravougaonik
и RotiraniPravougaonik
, видели смо да је могуће
да се идентификатор декларише као име за објекат базне класе, а да се инстанцира конструктором
изведене класе. Да бисмо се подсетили како такав објекат функционише, погледајмо следећи програм:
Резултат његовог рада је
A.F
A.F
B.F
Видимо да се метод F
класе B
извршава само ако је објекат и декларисан као објекат класе
B
, и инстанциран неким конструктором класе B
, као што је случај са објектом b2
.
Одавде закључујемо да у овом програму компајлер одлучјује који метод F
ће да буде позван
на основу тога како је објекат декларисан, а не на основу конструктора којим је објекат
инстанциран. Ово је разумљиво, јер је програм могао да изгледа и овако:
У овом случају компајлер и не може да зна којим конструктором ће објекат бити креиран, јер то зависи од уноса корисника.
Већ на овом месту може да се наслути да би за програмере било врло моћно када би на неки начин
могли да кажу компајлеру да одлуку о томе који метод F
да позове донесе на основу начина на
који је објекат конструисан, а не на основу декларисаног типа (што је овде базна класа).
Таква могућност постоји, а она се остварује помоћу виртуелних метода. Наиме, у базној класи метод можемо да означимо као виртуелан, што значи да се на месту позива користи информација о томе како је објекат конструисан и да ли је у класи којој припада употребљени конструктор дати метод редефинисан.
Следећи пример показује како се пишу и како функционишу виртуелни методи, а уједно и како се њихово функционисање разликује од дефинисања новог метода са истим именом, који смо до сада користили.
Програм исписује
b.f1 b.f2 b.f3 b.f4
b.f1 b.f2 b.f3 d.f4
b.f1 b.f2 d.f3 d.f4
Из примера се види да се код виртуелних метода F2
, F4
узима у обзир како је објекат
конструисан, као и да ли је одговарајући виртуелни метод редефинисан у изведеној класи.