logo

C++ virtuel funktion

  • En virtuel C++ funktion er en medlemsfunktion i basisklassen, som du omdefinerer i en afledt klasse. Det erklæres ved hjælp af det virtuelle nøgleord.
  • Det bruges til at fortælle compileren at udføre dynamisk kobling eller sen binding af funktionen.
  • Det er nødvendigt at bruge den enkelte markør til at henvise til alle objekterne i de forskellige klasser. Så vi opretter markøren til basisklassen, der refererer til alle de afledte objekter. Men når basisklassepointeren indeholder adressen på det afledte klasseobjekt, udfører den altid basisklassefunktionen. Dette problem kan kun løses ved at bruge den 'virtuelle' funktion.
  • En 'virtuel' er et nøgleord, der går forud for den normale erklæring af en funktion.
  • Når funktionen gøres virtuel, bestemmer C++, hvilken funktion der skal aktiveres ved kørsel, baseret på typen af ​​objektet, der peges på af basisklassemarkøren.

Sen binding eller dynamisk kobling

I sen binding løses funktionsopkald under kørsel. Derfor bestemmer compiler typen af ​​objekt ved kørsel og binder derefter funktionskaldet.


Regler for virtuel funktion

hvor meget vejer kat timpf
  • Virtuelle funktioner skal være medlemmer af en eller anden klasse.
  • Virtuelle funktioner kan ikke være statiske medlemmer.
  • De tilgås via objektpointere.
  • De kan være venner af en anden klasse.
  • En virtuel funktion skal defineres i basisklassen, selvom den ikke bruges.
  • Prototyperne af en virtuel funktion af basisklassen og alle de afledte klasser skal være identiske. Hvis de to funktioner har samme navn, men forskellige prototyper, vil C++ betragte dem som de overbelastede funktioner.
  • Vi kan ikke have en virtuel konstruktør, men vi kan have en virtuel destruktor
  • Overvej situationen, når vi ikke bruger det virtuelle søgeord.
 #include using namespace std; class A { int x=5; public: void display() { std::cout &lt;&lt; &apos;Value of x is : &apos; &lt;&lt; x&lt;<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;>

Produktion:

 Value of x is : 5 

I ovenstående eksempel er * a grundklassemarkøren. Markøren kan kun få adgang til basisklassemedlemmerne, men ikke medlemmerne af den afledte klasse. Selvom C++ tillader basismarkøren at pege på ethvert objekt afledt fra basisklassen, kan den ikke direkte få adgang til medlemmerne af den afledte klasse. Derfor er der behov for virtuel funktion, som tillader basispointeren at få adgang til medlemmerne af den afledte klasse.

C++ virtuel funktion Eksempel

Lad os se det simple eksempel på C++ virtuel funktion, der bruges til at fremkalde den afledte klasse i et program.

 #include { public: virtual void display() { cout &lt;&lt; &apos;Base class is invoked&apos;&lt;<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;>

Produktion:

 Derived Class is invoked 

Ren virtuel funktion

  • En virtuel funktion bruges ikke til at udføre nogen opgave. Den tjener kun som pladsholder.
  • Når funktionen ikke har nogen definition, er en sådan funktion kendt som ' gøre ingenting ' funktion.
  • Det ' gøre ingenting ' funktion er kendt som en ren virtuel funktion . En ren virtuel funktion er en funktion erklæret i basisklassen, som ikke har nogen definition i forhold til basisklassen.
  • En klasse, der indeholder den rene virtuelle funktion, kan ikke bruges til at erklære sine egne objekter, sådanne klasser er kendt som abstrakte basisklasser.
  • Hovedformålet med basisklassen er at give træk til de afledte klasser og at skabe den basispointer, der bruges til at opnå runtime polymorfi.

Ren virtuel funktion kan defineres som:

 virtual void display() = 0; 

Lad os se et simpelt eksempel:

syreegenskaber
 #include using namespace std; class Base { public: virtual void show() = 0; }; class Derived : public Base { public: void show() { std::cout &lt;&lt; &apos;Derived class is derived from the base class.&apos; <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 ovenstående eksempel indeholder basisklassen den rene virtuelle funktion. Derfor er basisklassen en abstrakt basisklasse. Vi kan ikke skabe objektet for basisklassen.