Sådan implementeres virtuel funktion i C ++?



Denne artikel introducerer dig til endnu et programmeringskoncept, der er Virtual Function i C ++. Konceptet understøttes af demonstration.

En virtuel funktion i C ++ er en medlemsfunktion inden for basisklassen, som vi omdefinerer i en afledt klasse. Denne artikel hjælper dig med at udforske konceptet i detaljer. Følgende punkter vil blive dækket i denne artikel,

Så lad os komme i gang med denne artikel om Virtual Function i C ++





Hvad er virtuel funktion?

En virtuel funktion er en medlemsfunktion inden for basisklassen, som vi omdefinerer i en afledt klasse. Det erklæres ved hjælp af det virtuelle nøgleord. Når en klasse, der indeholder en virtuel funktion, nedarves, omdefinerer den afledte klasse den virtuelle funktion, så den passer til dens egne behov.

Fortsætter med denne artikel om virtuel funktion i C ++



Regler for virtuel funktion i C ++:

  • De defineres altid i en basisklasse og tilsidesættes i afledt klasse, men det er ikke obligatorisk at tilsidesætte i den afledte klasse.
  • De virtuelle funktioner skal deklareres i den offentlige sektion i klassen.
  • De kan ikke være statiske eller venfunktion kan heller ikke være den virtuelle funktion i en anden klasse.
  • De virtuelle funktioner skal tilgås ved hjælp af en markør for at opnå kørselstidspolymorfisme.

Fortsætter med denne artikel om virtuel funktion i C ++.

Hvad er bindende?

Binding til funktioner betyder, at compileren overalt, hvor der er et funktionsopkald, skal vide, hvilken funktionsdefinition der skal matches. Dette afhænger af underskriften af ​​hver funktionserklæring og de opgaver, der er taget. Compileren skal også vide, at når denne matchning mellem funktionsopkaldet og valg af den korrekte definition sker.

goto i c ++

Fortsætter med denne artikel om virtuel funktion i C ++



Tidlig binding

Tidlig binding er et fænomen, hvor beslutningen om at matche forskellige funktionsopkald sker på selve kompileringstidspunktet, og kompilatoren forbinder linket direkte med adresser. Det er også kendt som statisk binding eller kompileringstidsbinding.

  • Som vi ved, skriver vi kode på sproget på højt niveau
  • Derefter konverterer compileren dette til sprog på lavt niveau, som computeren kan forstå, for det meste maskinsprog på tidspunktet for kompilering
  • Ved tidlig binding tilvejebringer compileren adressen til funktionserklæringsinstruktionen direkte til funktionsopkaldsinstruktionen
  • Således som navnet antyder, sker bindingen meget tidligt, før programmet kø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 () // tidligt bindende retur 0}

Produktion

Output- Virtuel funktion i C ++ - Edureka

afklaringer ion
I dette eksempel oprettede vi en markør a til moderklassen Dyr. Derefter ved at skrive a = & c begyndte markøren 'a' at henvise til objektet c i klassen Katte.
a -> lyd () - Ved kaldelse af funktionslyden (), der er til stede i begge klasser med markøren 'a', blev forældreklassens funktion kaldet, selvom markøren henviser til objektet til klassen Katte .

Dette skyldes tidlig binding. Vi ved, at 'a' er en markør i moderklassen, der henviser til objektet i barneklassen. Da tidlig binding finder sted på kompileringstidspunktet, matchede den derfor, når compileren så, at 'a' er en markør i moderklassen, opkaldet med 'sound ()' - funktionen i moderklassen uden at søge efter objektet, markøren det henviser til.

Fortsætter med denne artikel om virtuel funktion i C ++

Sen binding

I sen binding identificerer compileren objektet ved kørsel og matcher derefter funktionskaldet med den korrekte funktion. Det er også kendt som Dynamic Binding eller Runtime Binding.

Sen binding i ovenstående problem kan løses ved hjælp af virtuelt nøgleord i basisklassen. Lad os se, hvordan dette sker ved at bruge selve ovenstående eksempel, men kun tilføje virtuelt nøgleord.

Eksempel

#include ved hjælp af namespace std klasse Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <lyd () returnere 0}

Produktion

Forklaring
Her gøres funktionslyden () fra baseklassen virtuel, og derfor udfører compileren nu sen binding til denne funktion. Funktionskaldet for lyd () -funktionen matches nu med funktionsdefinitionen ved kørsel. Da kompilatoren nu identificerer markøren 'a' som henvisning til objektet 'c' for den afledte klasse Cats, vil den kalde lyden () -funktionen for class Cats.

Fortsætter med denne artikel om virtuel funktion i C ++

Ren virtuel funktion

En ren virtuel funktion i C ++ er en virtuel funktion, som vi ikke har en implementering for, vi kun erklærer den. En ren virtuel funktion erklæres ved at tildele 0 i erklæringen.

virtuel ugyldig lyd () = 0

hvordan man bruger svæve i css

Her er lyd () en ren virtuel funktion.

Fortsætter med denne artikel om virtuel funktion i C ++

Abstrakt klasse

En abstrakt klasse defineres som en klasse med en eller flere rene virtuelle funktioner. Som forklaret ovenfor er ren virtuel funktion en virtuel medlemsfunktion, der er markeret som uden implementering. Det er ikke muligt at implementere det med de oplysninger, der gives i klassen, inklusive basisklasser. En abstrakt klasse er også kendt som en abstrakt basisklasse.

mysql_fetch_array php

Eksempel

# inkludere brug af namespace std klasse Medarbejder // abstrakt basisklasse {virtual int getSalary () = 0 // ren virtuel funktion} class Employee_1: public Employee {int løn offentlig: Employee_1 (int s) {løn = s} int getSalary () {returløn}} klasse Medarbejder_2: offentlig ansat {int løn offentlig: Medarbejder_2 (int t) {løn = t} int getSalary () {returløn}} int hoved () {Medarbejder_1 e1 (5000) Medarbejder_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 } 

Produktion

Forklaring
Funktionen 'getSalary ()' i klassen Medarbejder er en ren virtuel funktion. Da medarbejderklassen indeholder den rene virtuelle funktion, er den derfor en abstrakt basisklasse.
Da den rene virtuelle funktion er defineret i underklasserne, defineres derfor funktionen 'getSalary ()' i både underklasser for klassen Medarbejder, dvs. i Medarbejder_1 og Medarbejder_2.

Fortsætter med denne artikel om virtuel funktion i C ++

Eksempel på virtuel funktion

#include ved hjælp af namespace std klasse 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 funktion_2 () ptr-> funktion_3 () ptr-> funktion_4 ()}

Produktion

Forklaring
Til funktionsopkald funktions_1 () kaldes basisklasseversion af funktion, funktion_2 () tilsidesættes i afledt klasse, så afledt klasseversion kaldes, funktion_3 () tilsidesættes ikke i afledt klasse og er virtuel funktion, så basisklasseversion kaldes, på samme måde tilsidesættes function_4 () ikke, så basisklasseversion kaldes.

Således er vi nået til slutningen af ​​denne artikel om 'Virtual Function in C ++'. Hvis du ønsker at lære mere, skal du tjekke af Edureka, et pålideligt online læringsfirma. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til at træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Spring.

Har du et spørgsmål til os? Nævn det i kommentarsektionen på denne blog, og vi vender tilbage til dig hurtigst muligt.