Forskjellen mellom virtuell og ren virtuell funksjon

Forfatter: Laura McKinney
Opprettelsesdato: 2 April 2021
Oppdater Dato: 6 Kan 2024
Anonim
Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained
Video: Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained

Innhold


Den virtuelle funksjonen og den rene virtuelle funksjonen er begge begrepene polymorfisme av kjøretid. Hovedforskjellen mellom ‘virtuell funksjon ' og ‘Ren virtuell funksjon’ er at ‘virtuell funksjon’ har sin definisjon i grunnklassen, og også de arvelige avledede klassene omdefinerer den. Den rene virtuelle funksjonen har ingen definisjon i baseklassen, og alle arvelige avledede klasser må omdefinere den.

Imidlertid blir den virtuelle funksjonen også kalt som dynamisk utsendelse og kjøretidsutsending, på grunn av at den valgte funksjonen er spesifisert i kjøretiden i samsvar med typen objekt som brukes.

Polymorfisme støttes av både språkene C ++ og Java. I Java brukes uttrykket “overstyring” i stedet for ‘virtuell funksjon’, da den virtuelle funksjonen er betegnelsen C ++.

  1. Sammenligningstabell
  2. Definisjon
  3. Viktige forskjeller
  4. Konklusjon

Sammenligningstabell

Grunnlag for sammenligningVirtuell funksjonRen virtuell funksjon
grunn~~POS=TRUNCVirtuell funksjon har sin definisjon i grunnklassen.Pure Virtual Function har ingen definisjon i grunnklassen.
Erklæringvirtuelt funksjonsnavn (parameter_list) {. . . . .};virtuelt funksjonsnavn (parameter_list) = 0;
Avledet klasseAlle avledede klasser overskrider kanskje den virtuelle funksjonen til baseklassen.Alle avledede klasser må overstyre den virtuelle funksjonen til baseklassen.
Effekt

Virtuelle funksjoner er hierarkiske. det påvirker ikke samlingen hvis noen avledede klasser ikke tilsidesetter den virtuelle funksjonen til baseklassen.Hvis alle avledede klasser ikke overskrider den virtuelle funksjonen til baseklassen, vil kompilasjonsfeilen oppstå.
Abstrakt klasseIngen konsept.Hvis en klasse inneholder minst en ren virtuell funksjon, blir den erklært abstrakt.


Definisjon av virtuell funksjon

De virtuell funksjon er medlemsfunksjonen til baseklassen, og den omdefineres av de avledede klassene som arver grunnklassen. Det er ikke nødvendig at alle arvelige avledede klasser må omdefinere den virtuelle funksjonen, den er bare omdefinert av de avledede klassene som kan kreve at den fungerer. En virtuell funksjon opprettes ved å erklære funksjonen i baseklassen forut for søkeordet 'virtuell'.

Erklæring:

klassebase {public: virtual type funt_name (parameter-list) {. . . }};

De arvelige avledede klassene kan omdefinere den virtuelle funksjonen uten noe ‘virtuelt’ nøkkelord. Avledede klasser omdefinerer den virtuelle funksjonen for å utføre oppgaven. Siden den virtuelle funksjonen omdefineres i avledede klasser, har vi flere former for den samme funksjonen. Hvilken versjon av funksjonen som blir kalt, avhenger nå av hva slags objekt det refereres til for å påkalle den funksjonen.


Multilevel arv

I arve i flere plan, der en avledet klasse som har arvet den virtuelle funksjonen fra sin baseklasse, når seg selv blir brukt som en baseklasse for en annen avledet klasse, kan den virtuelle funksjonen fremdeles overstyres. Så når en virtuell funksjon blir arvet, blir den virtuelle naturen også arvet.

Virtuelle funksjoner er også hierarkiske, dvs. hvis en avledet klasse ikke overstyrer / omdefinerer den virtuelle funksjonen som er arvet fra baseklassen, og når avledet klassens objekt påkaller den virtuelle funksjonen, blir den virtuelle funksjonen som er definert av baseklassen påkalt.

Definisjon av ren virtuell funksjon

Som sett ovenfor hvis avledet klasse ikke tilsidesetter den virtuelle funksjonen, brukes den virtuelle funksjonen som er definert av baseklassen. Men hva hvis selve baseklassen ikke definerer den virtuelle funksjonen. Mange ganger har baseklassen ingen definisjon for den virtuelle funksjonen, eller noen ganger vil du at alle avledede klasser må overstyre den virtuelle funksjonen.

For å håndtere disse to situasjonene ovenfor, støtter C ++ konseptet "Ren virtuell funksjon“. En ‘ren virtuell funksjon’ er erklært i baseklasse, men har ikke sin definisjon i grunnklassen. Den rene virtuelle funksjonen er erklært som følger.

virtuell type funct_name (parameter_list) = 0;

Hver gang en virtuell funksjon i baseklassen gjøres "ren", må hver avledede klasse obligatorisk overstyre den rene virtuelle funksjonen til baseklassen. Hvis den avledede klassen ikke klarer å tilsidesette den rene virtuelle funksjonen til baseklassen, vil det føre til kompilasjonsfeil.

Abstrakt klasse

Klassen som inneholder minst en ren funksjon kalles ‘abstrakt klasse’. Ingen objekter av abstrakte klasser kan opprettes, men du kan opprette referanser og pekere til abstrakte klasser. Medlemmer av de abstrakte klassene kan nås gjennom objektet for de avledede klassene som arver den abstrakte baseklassen.

Bruk en nøkkelord som du vil erklære abstrakt 'abstrakt' foran 'klasse' søkeord.

// for eksempel abstrakt klasse klassens navn {. . virtuell type funct_name (parameter_list) = 0; . . };

  1. Virtuelle funksjoner er definitivt definert i grunnklassen og omdefineres (overstyres) i den avledede klassen. På den annen side er ren virtuell funksjon grunnklassen spesielt ikke definert i baseklassen
  2. Avledet klasse om nødvendig redefinere (overstyre) den virtuelle funksjonen, mens, i tilfelle av ren virtuell funksjon, skal avledet klasse definitivt omdefinere den rene virtuelle funksjonen.
  3. Hvis den avledede klassen ikke klarer å omdefinere (overstyre) den virtuelle funksjonen, kan den bruke den virtuelle funksjonen til baseklassen. Motsatt, hvis en avledet klasse ikke overstyrer ren virtuell funksjon, oppstår kompilasjonsfeil.
  4. Baseklasse som inneholder den virtuelle funksjonen kan bli instantivert, dvs. at objektet kan opprettes. I motsetning til dette kan baseklassen som inneholder ren virtuell funksjon, dvs. en abstrakt klasse, ikke formidles ettersom en abstrakt klasse ikke er fullstendig definert.

Merk:
Prototypen til ‘virtuell funksjon’ og ‘ren virtuell funksjon’ forblir den samme gjennom hele programmet.

Konklusjon:

De 'virtuelle funksjonene' og 'ren virtuell funksjonen' har begge sin betydning, som i 'virtuelle funksjoner' trenger ikke alle avledede klasser å omdefinere den virtuelle funksjonen, og der vi ønsker at all avledet klasse skal omdefinere den virtuelle funksjonen, ren virtuell funksjon gjelder best der.