Hvordan implementere virtuell funksjon i C ++?



Denne artikkelen vil introdusere deg for enda et programmeringskonsept som er Virtual Function i C ++. Konseptet vil bli støttet av demonstrasjon.

En virtuell funksjon i C ++ er en medlemsfunksjon i basisklassen som vi omdefinerer i en avledet klasse. Denne artikkelen vil hjelpe deg med å utforske konseptet i detalj. Følgende tips vil bli dekket i denne artikkelen,

Så la oss komme i gang med denne artikkelen om Virtual Function i C ++





Hva er virtuell funksjon?

En virtuell funksjon er en medlemsfunksjon i basisklassen som vi omdefinerer i en avledet klasse. Det er erklært ved hjelp av det virtuelle nøkkelordet. Når en klasse som inneholder en virtuell funksjon arves, omdefinerer den avledede klassen den virtuelle funksjonen slik at den passer til sine egne behov.

Fortsetter med denne artikkelen om virtuell funksjon i C ++



Regler for virtuell funksjon i C ++:

  • De defineres alltid i en basisklasse og overstyres i avledet klasse, men det er ikke obligatorisk å overstyre i den avledede klassen.
  • De virtuelle funksjonene må deklareres i den offentlige delen av klassen.
  • De kan ikke være statiske eller vennefunksjon kan heller ikke være den virtuelle funksjonen til en annen klasse.
  • Du får tilgang til de virtuelle funksjonene ved hjelp av en peker for å oppnå polymorfisme i løpetid.

Fortsetter med denne artikkelen om virtuell funksjon i C ++.

Hva er bindende?

Binding for funksjoner betyr at kompilatoren trenger å vite hvilken funksjonsdefinisjon som skal tilpasses, uansett hvor det er en funksjonsanrop. Dette avhenger av signaturen til hver funksjonserklæring og oppgavene som blir tatt. Kompilatoren trenger også å vite at når denne matchingen mellom funksjonsanropet og valg av riktig definisjon vil skje.

Fortsetter med denne artikkelen om virtuell funksjon i C ++



Tidlig binding

Tidlig binding er et fenomen hvor avgjørelsen om å matche forskjellige funksjonsanrop skjer på selve kompileringstiden og kompilatoren knytter lenken direkte til adresser. Det er også kjent som statisk binding eller kompileringstid.

  • Som vi vet skriver vi kode på høyt nivå språk
  • Så konverterer kompilatoren dette til språk på lavt nivå som datamaskinen kan forstå, hovedsakelig maskinspråk på tidspunktet for kompilering
  • Tidlig binding gir kompilatoren direkte adressen til funksjonserklæringsinstruksjonen til funksjonsanropsinstruksjonen
  • Således, som navnet antyder, skjer bindingen veldig tidlig før programmet kjører.

Eksempel

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <lyd () // tidlig binding tilbake 0}

Produksjon

Utgang - Virtuell funksjon i C ++ - Edureka

avklaringer ion
I dette eksemplet opprettet vi en peker a til foreldreklassen Dyr. Så ved å skrive a = & c begynte pekeren ‘a’ å referere til objektet c i klassen Katter.
a -> lyd () - Ved å kalle funksjonslyden () som er tilstede i begge klassene av pekeren 'a', ble funksjonen til foreldreklassen kalt, selv om pekeren refererer til objektet til klassen Katter .

Dette skyldes tidlig binding. Vi vet at ‘a’ er en peker i foreldreklassen som refererer til objektet til barneklassen. Siden tidlig binding foregår ved kompileringstid, samsvarte den derfor når kompilatoren så at 'a' er en peker i foreldreklassen, samtalen med 'sound ()' -funksjonen til foreldreklassen uten å lete etter objektet pekeren den viser til.

Fortsetter med denne artikkelen om virtuell funksjon i C ++

Sen binding

I sen binding identifiserer kompilatoren objektet ved kjøretid og matcher deretter funksjonsanropet med riktig funksjon. Det er også kjent som Dynamic Binding eller Runtime Binding.

Sen binding i problemet ovenfor kan løses ved å bruke virtuelt nøkkelord i basisklassen. La oss se hvordan dette skjer ved å bruke selve eksemplet ovenfor, men bare legge til virtuelle søkeord.

Eksempel

#include using namespace std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <lyd () retur 0}

Produksjon

Forklaring
Her blir funksjonslyden () til baseklassen virtuell, og kompilatoren utfører nå sen binding for denne funksjonen. Nå vil funksjonsanropet til lydfunksjonen () bli matchet med funksjonsdefinisjonen ved kjøretid. Siden kompilatoren nå identifiserer pekeren ‘a’ som refererer til objektet ‘c’ til den avledede klassen Cats, vil den kalle lyd () -funksjonen til class Cats.

Fortsetter med denne artikkelen om virtuell funksjon i C ++

Ren virtuell funksjon

En ren virtuell funksjon i C ++ er en virtuell funksjon som vi ikke har noen implementering for, vi kun erklærer den. En ren virtuell funksjon erklæres ved å tilordne 0 i erklæringen.

virtuell ugyldig lyd () = 0

Her er lyd () en ren virtuell funksjon.

Fortsetter med denne artikkelen om virtuell funksjon i C ++

Abstrakt klasse

En abstrakt klasse er definert som en klasse med en eller flere rene virtuelle funksjoner. Som forklart ovenfor er ren virtuell funksjon en virtuell medlemsfunksjon som er merket som uten implementering. Det er ingen implementering mulig med informasjonen i klassen, inkludert basisklasser. En abstrakt klasse er også kjent som en abstrakt basisklasse.

Eksempel

# inkludere bruk av navneområde std klasse Ansatt // abstrakt basisklasse {virtual int getSalary () = 0 // ren virtuell funksjon} klasse Employee_1: offentlig ansatt {int lønn offentlig: Employee_1 (int s) {lønn = s} int getSalary () {returlønn}} klasse Employee_2: offentlig ansatt {int lønn offentlig: Employee_2 (int t) {lønn = t} int getSalary () {retur lønn}} 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 } 

Produksjon

Forklaring
Funksjonen ‘getSalary ()’ i klassen Ansatt er en ren virtuell funksjon. Siden medarbeiderklassen inneholder den rene virtuelle funksjonen, er den derfor en abstrakt basisklasse.
Siden den rene virtuelle funksjonen er definert i underklassene, defineres derfor funksjonen ‘getSalary ()’ i både underklassene til klassen Medarbeider, dvs. i Medarbeider_1 og Medarbeider_2.

Fortsetter med denne artikkelen om virtuell funksjon i C ++

Eksempel på virtuell funksjon

#include ved å bruke namespace std class base {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 funksjon_2 () ptr-> funksjon_3 () ptr-> funksjon_4 ()}

Produksjon

Forklaring
For funksjonsanrop for funksjon_1 () kalles baseklasseversjonen av funksjonen, funksjon_2 () overstyres i avledet klasse, slik at avledet klasseversjon kalles, funksjon_3 () overstyres ikke i avledet klasse og er virtuell funksjon, slik at basisklasseversjonen kalles, på samme måte overstyres ikke funksjon_4 (), så baseklasseversjonen kalles.

hvordan avslutte programmet java

Dermed har vi kommet til en slutt på denne artikkelen om ‘Virtual Function in C ++’. Hvis du ønsker å lære mer, sjekk ut av Edureka, et pålitelig online læringsfirma. Edurekas Java J2EE- og SOA-opplæring og sertifiseringskurs er designet for å trene deg for både kjerne- og avanserte Java-konsepter sammen med forskjellige Java-rammer som Hibernate & Spring.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet på denne bloggen, så kommer vi tilbake til deg så snart som mulig.