Садржај

Динамички полиморфизам

У овој лекцији:

  • шта је виртуелан, а шта апстрактан метод

  • шта је апстрактна класа

  • шта је динамички полиморфизам

Редефинисање метода

Причица - шта подразумевамо под редефинисањем. Сценарио - функционалност коју желимо

Слика - базна класа са abstract или virtual, изведене класе са override или ничим. Оне пре override су или апстрактне или користе дифолт, а оне после користе редефиницију.

Метод који је предвиђен за накнадно редефинисање, на месту првог помињања треба да буде означен као апстрактан (abstract) или као виртуелан (virtual).

  • abstract значи да метод није дефинисан и да треба да буде дефинисан у класама наследницама, за које желимо да имају инстанце.

  • virtual значи да је метод дефинисан и намењен за редефинисање. Овај метод је подразумевани за класе наследнице (важи за класе које га не редефинишу).

Ако је метод означен као апстрактан, редефинисање је обавезно, а ако је означен као виртуелан, редефинисање је могуће али није обавезно. Свако накнадно редефинисање у некој од класа наследница, означава се речју override.

  • override значи да се метод редефинише у односу на неку њему базну класу, а може (и не мора) да се даље редефинише у класама наследницама.

Пример динамичког полиморфизма

У примеру који следи појављују се два истоимена метода f, један у класи B, а други у класи C. Овакво појављивање истоимених метода је такође један облик полиморфизма, али другачији од оног који познајемо од раније.

У случају да у датом примеру корисник унесе слово b, биће позван конструктор класе B, а у противном ће бити позван конструктор класе C. Након тога, позива се метод f оне класе чији конструктор је креирао објекат a (испробајте ово).

Очигледно, компајлер у време превођења програма на машински кôд не може да зна да ли ће објекат a бити креиран конструктором класе B или класе C. Самим тим, компајлер не може да разреши на који метод a се односи позив a.f(). Ова дилема може да се разреши једино у време извршавања програма, па се зато овај облик полиморфизма назива динамички полиморфизам. Подсетимо се, за разлику од овог облика полиморфизма, статички полиморфизам представља појаву истоимених метода у једној класи, а може да се разреши (и разрешава се) у време компајлирања јер се такви истоимени методи разликују по листама параметара.

Како се разрешава динамички полиморфизам?

За класу која има виртуелне методе компајлер формира табелу, у којој сваки ред табеле одговара једном виртуелном методу. Када се објекат инстанцира, та табела се попуњава адресама актуелних (стварних) метода. Касније, када неки од метода буде позван, у табели се проналази адреса конкретног метода који треба позвати.

За више информација, потражите појам табела виртуелних метода (virtual method table).

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+