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,
- Što je virtualna funkcija?
- Pravila za virtualnu funkciju u C ++
- Što je obvezujuće?
- Rano povezivanje
- Kasno vezivanje
- Čista virtualna funkcija
- Sažetak klase
- Primjer za virtualnu funkciju
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
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) { coutfunction_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.