Разлика између виртуалне и чисте виртуалне функције

Аутор: Laura McKinney
Датум Стварања: 2 Април 2021
Ажурирати Датум: 11 Може 2024
Anonim
C++ - Tutorijal 68 - Abstraktne klase i čiste virtualne funkcije
Видео: C++ - Tutorijal 68 - Abstraktne klase i čiste virtualne funkcije

Садржај


Виртуелна и чиста виртуелна функција обоје су појмови полиморфизма времена извођења. Главна разлика између „виртуална функција ' и 'Чиста виртуална функција' је да "виртуална функција" има своју дефиницију у основној класи и да је и насљедне изведене класе редефинирају. Чиста виртуална функција нема дефиницију у основној класи и све насљедне изведене класе морају је редефинирати.

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

Полиморфизам подржава оба језика Ц ++ и Јава. У Јави се уместо „виртуалне функције“ користи термин „прегласавање“, јер је виртуелна функција израз Ц ++.

  1. Упоредни графикон
  2. Дефиниција
  3. Кључне разлике
  4. Закључак

Упоредни графикон

Основе за упоређивањеВиртуелна функцијаЧиста виртуелна функција
ОсновниВиртуална функција има своју дефиницију у основној класи.Чиста виртуална функција нема дефиницију у основној класи.
Изјававиртуал фунцт_наме (параметер_лист) {. . . . .};виртуални назив функције (параметар_лист) = 0;
Изведена класаСве изведене класе могу или не морају да надјачају виртуелну функцију основне класе.Све изведене класе морају надјачати виртуалну функцију основне класе.
Ефекат

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


Дефиниција виртуалне функције

Тхе виртуална функција је чланска функција основне класе, а редефинира је изведеним класама које насљеђују основну класу. Није неопходно да све наслеђене изведене класе морају редефинисати виртуелну функцију, већ је редефинисане само оне изведене класе које могу захтевати њено функционисање. Виртуелна функција креира се проглашавањем функције у основној класи која је претходила кључној речи „Виртуално“.

Изјава:

база класе {публиц: виртуелни тип фунт_наме (листа параметара) {. . . }};

Насљедне изведене класе могу редефинирати виртуалну функцију без икакве 'виртуалне' кључне ријечи. Изведене класе редефинирају виртуалну функцију да би извршио свој задатак. Како је виртуална функција редефинисана у изведеним класама, имамо више облика исте функције. Сада, која верзија функције се зове, зависи од врсте објекта који се позива за позивање те функције.


Вишеслојно насљеђивање

У мултилевенском насљеђивању, гдје изведена класа која је наслиједила виртуалну функцију од своје основне класе, а када се сама користи као основна класа за другу изведену класу, виртуална функција и даље може бити надјачана. Дакле, када се виртуална функција наслиједи, насљеђује се и њена виртуална природа.

Виртуелне функције су такође хијерархијске природе, тј. Ако изведена класа не надјачава / редефинише виртуелну функцију наслеђену из основне класе и када објект изведене класе позива ту виртуелну функцију, онда се позива виртуална функција дефинисана основном класом.

Дефиниција чисте виртуелне функције

Као што је горе наведено, ако изведена класа не надјачава виртуалну функцију, тада се користи виртуална функција дефинирана основном класом. Али шта ако основна класа сама не дефинише виртуелну функцију. Много пута, основна класа нема дефиницију виртуалне функције, или понекад желите да све изведене класе морају надјачати виртуалну функцију.

Да би решио ове горе наведене две ситуације, Ц ++ подржава концепт „Чиста виртуелна функција“. 'Чиста виртуална функција' је декларирана у основној класи, али она нема њену дефиницију у основној класи. Чиста виртуална функција декларирана је на сљедећи начин.

виртуелни тип фунцт_наме (параметар_лист) = 0;

Кад год се виртуелна функција у основној класи учини „чистом“, тада свака изведена класа мора обавезно надјачати чисту виртуелну функцију основне класе. Ако изведена класа не успе надјачати чисту виртуелну функцију основне класе, то ће резултирати грешком у компилацији.

Сажетак

Класа која садржи најмање једну чисту функцију назива се 'апстрактна класа'. Не могу се стварати објекти апстрактних класа, али можете креирати референце и показиваче на апстрактне класе. Члановима апстрактних класа може се приступити кроз објект изведених класа који наслеђује апстрактну основну класу.

Класа коју желите прогласити апстрактном, користите кључну реч 'апстрактан' испред 'класа' кључна реч.

// на пример апстрактна класа-име {. . виртуелни тип фунцт_наме (параметар_лист) = 0; . . };

  1. Виртуелне функције су дефинисане у основној класи и редефинисане (прегласавање) у изведеној класи. Са друге стране, чиста виртуална функција, основна класа посебно није дефинисана у основној класи
  2. Изведена класа ако је потребно редефинирати (надјачати) виртуалну функцију, док, у случају чисте виртуалне функције, изведена класа мора дефинитивно редефинирати чисту виртуалну функцију.
  3. Ако изведена класа не успе редефинирати (надјачати) виртуалну функцију, може користити виртуалну функцију основне класе. Супротно томе, ако изведена класа не успе да надјача чисту виртуелну функцију, тада долази до грешке у састављању.
  4. Базна класа која садржи виртуалну функцију може се инстанцирати, тј. Може се креирати њен објект. Насупрот томе, основна класа која садржи чисту виртуалну функцију, тј. Апстрактна класа се не може инстанцирати јер апстрактна класа није у потпуности дефинирана.

Белешка:
Прототип „виртуалне функције“ и „чисте виртуалне функције“ остаје исти у цијелом програму.

Закључак:

И „виртуалне функције“ и „чиста виртуална функција“ имају своју важност, као и у „виртуалним функцијама“, све изведене класе не требају редефинисати виртуалну функцију и тамо гдје желимо да сва изведена класа редефинира виртуалну функцију, чисту виртуалну тамо се најбоље примењује функција.