- En C++ virtuell funksjon er en medlemsfunksjon i basisklassen som du omdefinerer i en avledet klasse. Det er deklarert ved hjelp av det virtuelle nøkkelordet.
- Den brukes til å fortelle kompilatoren å utføre dynamisk kobling eller sen binding på funksjonen.
- Det er nødvendig å bruke enkeltpekeren for å referere til alle objektene i de forskjellige klassene. Så vi lager pekeren til basisklassen som refererer til alle de avledede objektene. Men når baseklassepekeren inneholder adressen til det avledede klasseobjektet, utfører alltid basisklassefunksjonen. Dette problemet kan bare løses ved å bruke den 'virtuelle' funksjonen.
- En 'virtuell' er et nøkkelord som går foran den normale erklæringen av en funksjon.
- Når funksjonen gjøres virtuell, bestemmer C++ hvilken funksjon som skal påkalles under kjøretiden basert på typen objekt som pekes av baseklassepekeren.
Sen binding eller dynamisk kobling
I sen binding løses funksjonsanrop under kjøretid. Derfor bestemmer kompilatoren typen objekt ved kjøring, og binder deretter funksjonskallet.
Regler for virtuell funksjon
gimp-fontliste
- Virtuelle funksjoner må være medlemmer av en klasse.
- Virtuelle funksjoner kan ikke være statiske medlemmer.
- De er tilgjengelige gjennom objektpekere.
- De kan være venner av en annen klasse.
- En virtuell funksjon må være definert i basisklassen, selv om den ikke brukes.
- Prototypene til en virtuell funksjon av basisklassen og alle de avledede klassene må være identiske. Hvis de to funksjonene har samme navn, men forskjellige prototyper, vil C++ betrakte dem som de overbelastede funksjonene.
- Vi kan ikke ha en virtuell konstruktør, men vi kan ha en virtuell destruktor
- Tenk på situasjonen når vi ikke bruker det virtuelle søkeordet.
#include using namespace std; class A { int x=5; public: void display() { std::cout << 'Value of x is : ' << x<<std::endl; } }; class b: public a { int y="10;" public: void display() std::cout << 'value of is : ' <<y<<std::endl; main() *a; b b; a->display(); return 0; } </std::endl;>
Produksjon:
Value of x is : 5
I eksemplet ovenfor er * a grunnklassepekeren. Pekeren har bare tilgang til basisklassemedlemmene, men ikke medlemmene av den avledede klassen. Selv om C++ tillater basepekeren å peke til ethvert objekt avledet fra basisklassen, kan den ikke få direkte tilgang til medlemmene av den avledede klassen. Derfor er det behov for virtuell funksjon som lar basepekeren få tilgang til medlemmene av den avledede klassen.
C++ virtuell funksjon Eksempel
La oss se det enkle eksemplet på C++ virtuell funksjon som brukes til å påberope den avledede klassen i et program.
#include { public: virtual void display() { cout << 'Base class is invoked'<<endl; } }; class b:public a { public: void display() cout << 'derived is invoked'<<endl; int main() a* a; pointer of base b b; object derived a->display(); //Late Binding occurs } </endl;>
Produksjon:
Derived Class is invoked
Ren virtuell funksjon
- En virtuell funksjon brukes ikke til å utføre noen oppgave. Den fungerer bare som en plassholder.
- Når funksjonen ikke har noen definisjon, er denne funksjonen kjent som ' gjør ingenting ' funksjon.
- den ' gjør ingenting ' funksjon er kjent som en ren virtuell funksjon . En ren virtuell funksjon er en funksjon deklarert i basisklassen som ikke har noen definisjon i forhold til basisklassen.
- En klasse som inneholder den rene virtuelle funksjonen kan ikke brukes til å deklarere sine egne objekter, slike klasser er kjent som abstrakte basisklasser.
- Hovedmålet med basisklassen er å gi egenskapene til de avledede klassene og å lage basispekeren som brukes for å oppnå kjøretidspolymorfismen.
Ren virtuell funksjon kan defineres som:
virtual void display() = 0;
La oss se et enkelt eksempel:
rekke strukturer i c-språk
#include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout << 'Derived class is derived from the base class.' <show(); return 0; } < pre> <p> <strong>Output:</strong> </p> <pre> Derived class is derived from the base class. </pre> <p>In the above example, the base class contains the pure virtual function. Therefore, the base class is an abstract base class. We cannot create the object of the base class.</p></show();>
I eksemplet ovenfor inneholder basisklassen den rene virtuelle funksjonen. Derfor er basisklassen en abstrakt basisklasse. Vi kan ikke lage objektet til basisklassen.