Kako implementirati virtualnu funkciju u C ++?



Ovaj će vas članak upoznati s još jednim konceptom programiranja koji je virtualna funkcija u C ++-u. Koncept će biti podržan demonstracijom.

Virtualna funkcija u C ++ je funkcija člana unutar osnovne klase koju redefiniramo u izvedenoj klasi. Ovaj će vam članak pomoći da detaljno istražite koncept. U ovom će članku biti obrađeni sljedeći putokazi,

Pa krenimo s ovim člankom o virtualnoj funkciji na C ++





Što je virtualna funkcija?

Virtualna funkcija je funkcija člana unutar osnovne klase koju redefiniramo u izvedenoj klasi. Deklarira se pomoću virtualne ključne riječi. Kada se naslijedi klasa koja sadrži virtualnu funkciju, izvedena klasa redefinira virtualnu funkciju prema vlastitim potrebama.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++



Pravila za virtualnu funkciju u C ++:

  • Oni su uvijek definirani u osnovnoj klasi i nadjačani u izvedenoj klasi, ali nije obavezno nadjačati u izvedenoj klasi.
  • Virtualne funkcije moraju se deklarirati u javnom odjeljku klase.
  • Oni ne mogu biti statični ili funkcija prijatelja također ne mogu biti virtualna funkcija druge klase.
  • Virtualnim funkcijama treba pristupiti pomoću pokazivača kako bi se postigao polimorfizam vremena izvođenja.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++.

Što je obvezujuće?

Vezivanje za funkcije znači da gdje god postoji poziv funkcije, sastavljač mora znati kojoj definiciji funkcije treba odgovarati. To ovisi o potpisu svake deklaracije funkcije i dodijeljenim zadacima. Također, prevoditelj mora znati da će se dogoditi ovo podudaranje između poziva funkcije i odabira ispravne definicije.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++



Rano vezivanje

Rano vezivanje je fenomen kod kojeg se odluka o podudaranju različitih poziva funkcija događa u vrijeme samog sastavljanja, a prevoditelj izravno povezuje vezu s adresama. Također je poznato kao statičko vezivanje ili povezivanje u vremenu kompajliranja.

  • Kao što znamo, kod pišemo na jeziku visoke razine
  • Tada prevodilac to pretvara u jezik niske razine koji računalo može razumjeti, uglavnom u jezik stroja u vrijeme sastavljanja
  • U ranom vezivanju, kompajler izravno daje adresu naredbe za deklaraciju funkcije uputi za poziv funkcije
  • Stoga, kao što i samo ime govori, vezivanje se događa vrlo rano prije pokretanja programa.

Primjer

#include using space names std class Životinje {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <sound () // povratak prijevremenog vezivanja 0}

Izlaz

Izlaz- Virtualna funkcija u C ++ - Edureka

kako prekinuti program

pojašnjenja ion
U ovom smo primjeru stvorili pokazivač a na roditeljsku klasu Životinje. Tada je pisanjem a = & c pokazivač 'a' počeo upućivati ​​na objekt c klase Mačke.
a -> zvuk () - Pri pozivu funkcije sound () koja je prisutna u obje klase pomoću pokazivača 'a', funkcija roditeljske klase je pozvana, čak i ako se pokazivač odnosi na objekt klase Cats .

To je zbog ranog vezivanja. Znamo da je 'a' pokazivač nadređene klase koja se odnosi na objekt podređene klase. Budući da se rano povezivanje odvija u vrijeme prevođenja, kad je prevodilac vidio da je 'a' pokazivač nadređene klase, podudarao je poziv s funkcijom 'sound ()' nadređene klase bez traženja objekta pokazivača na njega odnosi se na.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++

Kasno obvezujuće

U kasnom vezivanju, kompajler identificira objekt tijekom izvođenja, a zatim podudara poziv funkcije s ispravnom funkcijom. Poznato je i pod nazivom Dinamičko vezanje ili Runtime Binding.

Kasno vezivanje u gore navedenom problemu može se riješiti upotrebom virtualne ključne riječi u osnovnoj klasi. Pogledajmo kako se to događa pomoću samog gornjeg primjera, ali samo dodavanjem virtualne ključne riječi.

Primjer

#include using space names std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <zvuk () povratak 0}

Izlaz

Obrazloženje
Ovdje se zvuk funkcije () osnovne klase čini virtualnim, tako da kompajler sada izvodi kasno vezivanje za ovu funkciju. Sada će se poziv funkcije funkcije sound () uskladiti s definicijom funkcije tijekom izvođenja. Budući da prevodilac sada identificira pokazivač 'a' kao referencu na objekt 'c' izvedene klase Cats, pozvat će funkciju sound () klase Cats.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++

Čista virtualna funkcija

Čista virtualna funkcija u C ++-u je virtualna funkcija za koju nemamo implementaciju, već je samo deklariramo. Čista virtualna funkcija deklarira se dodjeljivanjem 0 u deklaraciji.

virtualni void zvuk () = 0

Ovdje je zvuk () čista virtualna fukcija.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++

Sažetak klase

Apstraktna klasa definira se kao klasa s jednom ili više čistih virtualnih funkcija. Kao što je gore objašnjeno, čista virtualna funkcija je funkcija virtualnog člana koja je označena kao da nema implementacije. Nije moguća implementacija s podacima navedenim u klasi, uključujući bilo koju osnovnu klasu. Apstraktna klasa poznata je i kao apstraktna osnovna klasa.

Primjer

#include using namespace std class Employee // apstraktna osnovna klasa {virtual int getSalary () = 0 // pure virtual function} class Employee_1: public Employee {int plata public: Employee_1 (int s) {plata = s} int getSalary () {povratna plaća}} klasa Zaposlenik_2: javni Zaposlenik {int plata javna: Zaposlenik_2 (int t) {plata = t} int getSalary () {povratna plata}} int glavna () {Zaposlenik_1 e1 (5000) Zaposlenik_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 } 

Izlaz

što je binarno pretraživanje u javi

Obrazloženje
Funkcija ‘getSalary ()’ u klasi Employee čista je virtualna funkcija. Budući da klasa Employee sadrži čistu virtualnu funkciju, to je apstraktna osnovna klasa.
Budući da je čista virtualna funkcija definirana u potklasama, stoga je funkcija ‘getSalary ()’ definirana u obje podklase klase Employee, tj. U Employee_1 i Employee_2.

Nastavljamo s ovim člankom o virtualnoj funkciji na C ++

Primjer za virtualnu funkciju

#include koristeći bazu prostora std klase {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 ()}

Izlaz

Obrazloženje
Za poziv funkcije function_1 () poziva se verzija funkcije osnovne klase, funkcija_2 () je nadjačana u izvedenoj klasi, tako se zove izvedeno izvedeno klasje, funkcija_3 () nije nadjačana u izvedenoj klasi i virtualna je funkcija, pa se zove verzija osnovne klase, slično function_4 () nije nadjačana pa se zove verzija osnovne klase.

Tako smo došli do kraja ovog članka o 'Virtualnoj funkciji u C ++'. Ako želite saznati više, pogledajte Edureka, pouzdane tvrtke za internetsko učenje. Edurekin tečaj za obuku i certificiranje Java J2EE i SOA osmišljen je kako bi vas osposobio za osnovne i napredne Java koncepte zajedno s raznim Java okvirima poput Hibernate & Spring.

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare ovog bloga i javit ćemo vam se što je prije moguće.