Hur implementerar jag virtuell funktion i C ++?



Den här artikeln presenterar dig för ytterligare ett programmeringskoncept som är Virtual Function i C ++. Konceptet stöds av demonstration.

En virtuell funktion i C ++ är en medlemsfunktion inom basklassen som vi omdefinierar i en härledd klass. Denna artikel hjälper dig att utforska konceptet i detalj. Följande tips kommer att behandlas i den här artikeln,

Så låt oss komma igång med den här artikeln om virtuell funktion i C ++





Vad är virtuell funktion?

En virtuell funktion är en medlemsfunktion inom basklassen som vi omdefinierar i en härledd klass. Det deklareras med hjälp av det virtuella nyckelordet. När en klass som innehåller en virtuell funktion ärvs, definierar den härledda klassen den virtuella funktionen så att den passar sina egna behov.

Fortsätter med den här artikeln om virtuell funktion i C ++



Regler för virtuell funktion i C ++:

  • De definieras alltid i en basklass och åsidosätts i härledd klass men det är inte obligatoriskt att åsidosätta i den härledda klassen.
  • De virtuella funktionerna måste deklareras i den offentliga delen av klassen.
  • De kan inte vara statiska eller en vänfunktion kan inte heller vara den virtuella funktionen för en annan klass.
  • De virtuella funktionerna bör nås med en pekare för att uppnå körtidspolymorfism.

Fortsätter med den här artikeln om virtuell funktion i C ++.

Vad är bindande?

Att binda för funktioner innebär att kompilatorn överallt där det finns ett funktionsanrop behöver veta vilken funktionsdefinition som ska matchas. Detta beror på signaturen för varje funktionsdeklaration och de uppdrag som tas. Dessutom måste kompilatorn veta att när denna matchning mellan funktionsanropet och att välja rätt definition kommer att ske.

Fortsätter med den här artikeln om virtuell funktion i C ++



Tidig bindning

Tidig bindning är ett fenomen där beslutet att matcha olika funktionssamtal sker vid själva sammanställningstiden och kompilatorn associerar länken direkt med adresser. Det är också känt som statisk bindning eller sammanbindningstid.

hur man driver makten i java
  • Som vi vet skriver vi kod på högnivåspråket
  • Sedan konverterar kompilatorn detta till språk på låg nivå som datorn kan förstå, mest maskinspråk vid tidpunkten för sammanställningen
  • I tidig bindning tillhandahåller kompilatorn direkt adressen till funktionsdeklarationsinstruktionen till funktionsanropsinstruktionen
  • Således som namnet antyder händer bindningen mycket tidigt innan programmet körs.

Exempel

#include using namespace std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <ljud () // tidigt bindande retur 0}

Produktion

Output - Virtuell funktion i C ++ - Edureka

förtydliganden Jon
I det här exemplet skapade vi en pekare a till föräldraklassen Djur. Sedan genom att skriva a = & c började pekaren 'a' hänvisa till objektet c för klassen Katter.
a -> ljud () - När man anropar funktionsljudet () som finns i båda klasserna med pekaren 'a', fick moderklassens funktion, även om pekaren hänvisar till objektet i klasskatterna .

Detta beror på tidig bindning. Vi vet att 'a' är en pekare i föräldraklassen som hänvisar till objektet i barnklassen. Eftersom tidig bindning äger rum vid kompileringstid, så när kompilatorn såg att 'a' är en pekare i moderklassen, matchade den samtalet med funktionen 'sound ()' för moderklassen utan att söka efter objektet pekaren det hänvisar till.

Fortsätter med den här artikeln om virtuell funktion i C ++

Sen bindning

I sen bindning identifierar kompilatorn objektet vid körning och matchar sedan funktionsanropet med rätt funktion. Det är också känt som Dynamic Binding eller Runtime Binding.

Sen bindning i ovanstående problem kan lösas med virtuellt nyckelord i basklassen. Låt oss se hur detta händer genom att använda exemplet ovan, men bara lägga till virtuellt nyckelord.

Exempel

#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' <ljud () return 0}

Produktion

Förklaring
Här görs funktionsljudet () för basklassen virtuellt, så kompilatorn utför nu sen bindning för denna funktion. Nu kommer funktionsanropet för ljudfunktionen () att matchas till funktionsdefinitionen vid körning. Eftersom kompilatorn nu identifierar pekaren 'a' som hänvisar till objektet 'c' för den härledda klasskatten, kommer den att kalla ljudfunktionen () för klasskatterna.

Fortsätter med den här artikeln om virtuell funktion i C ++

vad är datavisualisering i tablå

Ren virtuell funktion

En ren virtuell funktion i C ++ är en virtuell funktion som vi inte har någon implementering för, vi deklarerar bara den. En ren virtuell funktion deklareras genom att tilldela 0 i deklarationen.

virtuellt tomrumsljud () = 0

Här är ljud () en ren virtuell funktion.

Fortsätter med den här artikeln om virtuell funktion i C ++

Abstrakt klass

En abstrakt klass definieras som en klass med en eller flera virtuella funktioner. Som förklarats ovan är ren virtuell funktion en virtuell medlemsfunktion som är markerad som utan implementering. Det går inte att implementera den med informationen i klassen, inklusive basklasser. En abstrakt klass är också känd som en abstrakt basklass.

Exempel

#include using namespace std class Anställd // abstrakt basklass {virtual int getSalary () = 0 // ren virtuell funktion} class Employee_1: public Employee {int lön public: Employee_1 (int s) {lön = s} int getSalary () {returlön}} klass Anställd_2: offentlig anställd {int lön offentlig: Employee_2 (int t) {lön = t} int getSalary () {returlön}} int huvud () {Anställd_1 e1 (5000) Anställd_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

Förklaring
Funktionen 'getSalary ()' i klassen Anställd är en ren virtuell funktion. Eftersom medarbetarklassen innehåller den rena virtuella funktionen är det därför en abstrakt basklass.
Eftersom den rena virtuella funktionen definieras i underklasserna definieras därför funktionen 'getSalary ()' i både underklasserna för klassen Anställd dvs i Anställd_1 och Anställd_2.

Fortsätter med den här artikeln om virtuell funktion i C ++

Exempel på virtuell funktion

#include using 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 funktion_2 () ptr-> funktion_3 () ptr-> funktion_4 ()}

Produktion

Förklaring
För funktionsanrop funktions_1 () kallas basklassversion av funktion, funktion_2 () åsidosätts i härledd klass så härledd klassversion kallas, funktion_3 () åsidosätts inte i härledd klass och är virtuell funktion så basklassversion kallas, på samma sätt åsidosätts inte funktion_4 () så basklassversion kallas.

Således har vi kommit till slutet av den här artikeln om ”Virtual Function in C ++”. Om du vill veta mer, kolla in av Edureka, ett pålitligt inlärningsföretag online. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för att träna dig för både grundläggande och avancerade Java-koncept tillsammans med olika Java-ramverk som Hibernate & Spring.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen på den här bloggen så kommer vi tillbaka till dig så snart som möjligt.