Како имплементирати виртуелну функцију у Ц ++?



Овај чланак ће вас упознати са још једним концептом програмирања, а то је виртуелна функција у Ц ++. Концепт ће бити подржан демонстрацијом.

Виртуелна функција у Ц ++ је функција члана унутар основне класе коју редефинишемо у изведеној класи. Овај чланак ће вам помоћи да детаљно истражите концепт. Следећи путокази ће бити обрађени у овом чланку,

Па кренимо са овим чланком о виртуелној функцији на Ц ++





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

Виртуелна функција је функција члана унутар основне класе коју редефинишемо у изведеној класи. Декларише се помоћу виртуелне кључне речи. Када се класа која садржи виртуелну функцију наслеђује, изведена класа редефинише виртуелну функцију у складу са сопственим потребама.

Настављамо са овим чланком о виртуелној функцији на Ц ++



Правила за виртуелну функцију на Ц ++:

  • Они су увек дефинисани у основној класи и замењени у изведеној класи, али није обавезно надјачати у изведеној класи.
  • Виртуалне функције морају бити декларисане у јавном одељку класе.
  • Не могу бити статичке или функције пријатеља, такође не могу бити виртуелне функције друге класе.
  • Виртуалним функцијама треба приступити помоћу показивача да би се постигао полиморфизам времена извођења.

Настављамо са овим чланком о виртуелној функцији на Ц ++.

Шта је обавезујуће?

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

Настављамо са овим чланком о виртуелној функцији на Ц ++



Рано везивање

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

  • Као што знамо, код пишемо на језику високог нивоа
  • Тада преводилац то претвара у језик ниског нивоа који рачунар може да разуме, углавном у време машинског језика у време компајлирања
  • У раном везивању, компајлер директно даје адресу инструкције за декларацију функције инструкцији позива за функцију
  • Стога, као што и само име говори, везивање се дешава врло рано пре него што програм почне.

Пример

#инцлуде усинг спаце намес стд цласс Анималс {публиц: воид соунд () {цоут<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <соунд () // повратак раног везивања 0}

Оутпут

Излаз- Виртуелна функција у Ц ++ - Едурека

појашњења ион
У овом примеру смо креирали показивач а на родитељску класу Животиње. Затим је писањем а = & ц, показивач „а“ почео да се односи на објекат ц класе Цатс.
а -> звук () - При позивању функције звук () која је присутна у обе класе помоћу показивача 'а', функција родитељске класе је позвана, чак и ако се показивач односи на објекат класе Мачке .

Ово је због раног везивања. Знамо да је „а“ показивач на родитељску класу која се односи на објекат подређене класе. Будући да се рано везивање одвија током времена компајлирања, кад је преводилац видео да је 'а' показивач надређене класе, подударао је позив са функцијом 'соунд ()' родитељске класе без тражења објекта показивача односи се на.

Настављамо са овим чланком о виртуелној функцији на Ц ++

Касно везивање

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

Касно везивање у горе наведеном проблему може се решити коришћењем виртуелне кључне речи у основној класи. Погледајмо како се то дешава помоћу самог горњег примера, али само додавањем виртуелне кључне речи.

Пример

#инцлуде усинг спаце намес стд цласс Анималс {публиц: виртуал воид соунд () {цоут<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <звук () повратак 0}

Оутпут

Објашњење
Овде се звук функције () основне класе чини виртуелним, тако да компајлер сада изводи касно везивање за ову функцију. Сада ће функцијски позив функције соунд () бити усклађен са дефиницијом функције током извођења. Пошто компајлер сада идентификује показивач „а“ као референцу на објекат „ц“ изведене класе Цатс, позваће функцију соунд () класе Цатс.

Настављамо са овим чланком о виртуелној функцији на Ц ++

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

Чиста виртуелна функција у Ц ++ је виртуелна функција за коју немамо имплементацију, већ је само декларишемо. Чиста виртуелна функција декларише се додељивањем 0 у декларацији.

виртуални воид звук () = 0

Овде је звук () чиста виртуелна фукција.

Настављамо са овим чланком о виртуелној функцији на Ц ++

Апстрактни час

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

Пример

#инцлуде усинг спаце намес стд цласс Емплоиее // абстрацт басе цласс {виртуал инт гетСалари () = 0 // пуре виртуал фунцтион} цласс Емплоиее_1: публиц Емплоиее {инт паи публиц: Емплоиее_1 (инт с) {паи = с} инт гетСалари () {повратна плата}} класа Запослени_2: јавни Запослени {инт плата јавна: Запослени_2 (инт т) {плата = т} инт гетСалари () {повратна плата}} инт главна () {Запослени_1 е1 (5000) Запослени_2 е2 (3000) инт а, ба = е1.гетСалари () б = е2.гетСалари () цоут<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Оутпут

Објашњење
Функција ‘гетСалари ()’ у класи Емплоиее је чиста виртуелна функција. Будући да класа Емплоиее садржи чисту виртуелну функцију, то је апстрактна основна класа.
Пошто је чиста виртуелна функција дефинисана у поткласама, функција „гетСалари ()“ је дефинисана у обе подкласе класе Запослени, тј. У Запослени_1 и Запослени_2.

Настављамо са овим чланком о виртуелној функцији на Ц ++

Пример за виртуелну функцију

#инцлуде усинг спаце намес стд цласс басе {публиц: воид фунцтион_1 () {цоут<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout фунцтион_2 () птр-> фунцтион_3 () птр-> фунцтион_4 ()}

Оутпут

Објашњење
За позив функције_1 () позива се верзија функције основне класе, функција_2 () се замењује у изведеној класи, тако се зове изведена класа, функција_3 () се не поништава у изведеној класи и представља виртуелну функцију, па се зове верзија основне класе, на сличан начин фунцтион_4 () није надјачана па се зове верзија основне класе.

улоге и одговорности хадооп програмера

Тако смо дошли до краја овог чланка о „Виртуелној функцији у Ц ++“. Ако желите да сазнате више, погледајте Едурека, поуздана компанија за учење на мрежи. Едурекин курс за обуку и сертификацију Јава Ј2ЕЕ и СОА осмишљен је тако да вас оспособи за основне и напредне Јава концепте, заједно са различитим Јава оквирима попут Хибернате & Спринг.

Имате питање за нас? Молимо вас да га помените у одељку за коментаре овог блога и јавићемо вам се што је пре могуће.