Как да внедрим виртуална функция в C ++?



Тази статия ще ви запознае с още една концепция за програмиране, която е виртуална функция в C ++. Концепцията ще бъде подкрепена с демонстрация.

Виртуална функция в C ++ е функция член в рамките на базовия клас, който ние предефинираме в производен клас. Тази статия ще ви помогне да разгледате концепцията в детайли. Следните указания ще бъдат разгледани в тази статия,

Така че нека започнем с тази статия за Виртуална функция в C ++





Какво е виртуална функция?

Виртуалната функция е функция член в базовия клас, която ние предефинираме в производен клас. Декларира се с помощта на виртуалната ключова дума. Когато клас, съдържащ виртуална функция, се наследи, производният клас предефинира виртуалната функция, за да отговаря на собствените си нужди.

Продължавайки с тази статия за Виртуална функция в C ++



Правила за виртуална функция в C ++:

  • Те винаги се дефинират в основен клас и се заменят в производен клас, но не е задължително да се заменят в производния клас.
  • Виртуалните функции трябва да бъдат декларирани в публичния раздел на класа.
  • Те не могат да бъдат статични или приятелска функция също не могат да бъдат виртуална функция на друг клас.
  • Виртуалните функции трябва да бъдат достъпни с помощта на указател за постигане на полиморфизъм по време на изпълнение.

Продължавайки с тази статия за Виртуална функция в C ++.

Какво е обвързващо?

Обвързването за функции означава, че навсякъде, където има извикване на функция, компилаторът трябва да знае на коя дефиниция на функцията трябва да се съчетае. Това зависи от сигнатурата на всяка декларация за функция и взетите задания. Също така, компилаторът трябва да знае, че когато това съвпадение между извикването на функцията и избора на правилната дефиниция ще се случи.

Продължавайки с тази статия за Виртуална функция в C ++



__init__ в python

Ранно подвързване

Ранното обвързване е явление, при което решението за съвпадение на различни извиквания на функции се случва по време на самото компилиране и компилаторът директно свързва връзката с адреси. Известно е също като статично свързване или свързване по време на компилация.

  • Както знаем, ние пишем код на езика на високо ниво
  • Тогава компилаторът преобразува това в език на ниско ниво, който компютърът може да разбере, най-вече машинен език по време на компилацията
  • В ранното обвързване компилаторът директно предоставя адреса на инструкцията за деклариране на функция към инструкцията за извикване на функция
  • Така, както подсказва името, обвързването се случва много рано, преди програмата да се стартира.

Пример

#include използвайки пространство от имена std клас Животни {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // връщане в началото на обвързването 0}

Изход

Изход - Виртуална функция в C ++ - Edureka

разяснения йон
В този пример създадохме указател a към родителския клас Animals. След това, като напишете a = & c, показалецът „a“ започна да се позовава на обекта c от класа Cats.
a -> sound () - При извикване на функцията sound (), която присъства и в двата класа от показалеца 'a', се извиква функцията на родителския клас, дори ако указателят се отнася до обекта на класа Cats .

Това се дължи на ранното обвързване. Знаем, че ‘a’ е указател на родителския клас, отнасящ се до обекта на дъщерния клас. Тъй като ранното свързване се извършва по време на компилация, следователно, когато компилаторът видя, че 'a' е указател на родителския клас, той съчетава повикването с функцията 'sound ()' на родителския клас, без да търси обекта, указателя се отнася до.

Продължавайки с тази статия за Виртуална функция в C ++

Късно обвързване

При късно свързване компилаторът идентифицира обекта по време на изпълнение и след това съпоставя повикването на функцията с правилната функция. Известно е също като динамично свързване или свързване по време на изпълнение.

Късно обвързване в горния проблем може да бъде решено чрез използване на виртуална ключова дума в базовия клас. Нека да видим как се случва това, като използваме горния пример, но само добавяме виртуална ключова дума.

Пример

#include използвайки пространство за имена std клас Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <звук () връщане 0}

Изход

Обяснение
Тук функционалният звук () на базовия клас е направен виртуален, като по този начин компилаторът изпълнява късно свързване за тази функция. Сега извикването на функцията на функцията sound () ще бъде съчетано с дефиницията на функцията по време на изпълнение. Тъй като сега компилаторът идентифицира указател ‘a’ като препращащ към обекта ‘c’ от извлечения клас Cats, той ще извика функцията sound () на класа Cats.

Продължавайки с тази статия за Виртуална функция в C ++

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

Чистата виртуална функция в C ++ е виртуална функция, за която нямаме изпълнение, ние само я декларираме. Чиста виртуална функция се декларира чрез присвояване на 0 в декларацията.

виртуален празен звук () = 0

Тук звукът () е чисто виртуална комбинация.

Продължавайки с тази статия за Виртуална функция в C ++

Абстрактен клас

Абстрактният клас се определя като клас с една или повече чисти виртуални функции. Както е обяснено по-горе, чистата виртуална функция е функция на виртуален член, която е маркирана като няма реализация. Не е възможно изпълнение с информацията, предоставена в класа, включително всички базови класове. Абстрактният клас е известен още като абстрактен основен клас.

Пример

#include използвайки пространство на имена std class Служител // абстрактно базов клас {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Служител {int заплата public: Employee_1 (int s) {pay = s} int getSalary () {return pay}} клас Служител_2: публичен служител {int заплата public: Служител_2 (int t) {pay = t} int getSalary () {return pay}} int main () {Employee_1 e1 (5000) Employee_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Изход

Обяснение
Функцията ‘getSalary ()’ в класа Служител е чисто виртуална функция. Тъй като класът Employee съдържа чисто виртуалната функция, следователно той е абстрактен базов клас.
Тъй като чистата виртуална функция е дефинирана в подкласовете, следователно функцията ‘getSalary ()’ е дефинирана и в двата подкласа на класа Служител, т.е. в Служител_1 и Служител_2.

Продължавайки с тази статия за Виртуална функция в C ++

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

#include използвайки пространство на имена std клас база {public: void function_1 () {cout<< '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 function_2 () ptr-> function_3 () ptr-> function_4 ()}

Изход

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

По този начин стигнахме до края на тази статия за „Виртуална функция в C ++“. Ако искате да научите повече, разгледайте от Edureka, доверена компания за онлайн обучение. Курсът за обучение и сертифициране на Java J2EE и SOA на Edureka е предназначен да ви обучи както за основните, така и за разширените Java концепции, заедно с различни Java рамки като Hibernate & Spring.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на този блог и ние ще се свържем с вас възможно най-скоро.