logo

C++ virtuele functie

  • Een virtuele C++-functie is een lidfunctie in de basisklasse die u opnieuw definieert in een afgeleide klasse. Het wordt gedeclareerd met behulp van het virtuele trefwoord.
  • Het wordt gebruikt om de compiler te vertellen dynamische koppeling of late binding op de functie uit te voeren.
  • Het is noodzakelijk om de enkele pointer te gebruiken om naar alle objecten van de verschillende klassen te verwijzen. We creëren dus de pointer naar de basisklasse die verwijst naar alle afgeleide objecten. Maar wanneer de basisklasse-aanwijzer het adres van het afgeleide klasseobject bevat, wordt altijd de basisklassefunctie uitgevoerd. Dit probleem kan alleen worden opgelost door gebruik te maken van de 'virtuele' functie.
  • Een 'virtueel' is een trefwoord dat voorafgaat aan de normale declaratie van een functie.
  • Wanneer de functie virtueel wordt gemaakt, bepaalt C++ welke functie tijdens de runtime moet worden aangeroepen op basis van het type object waarnaar wordt verwezen door de basisklasse-pointer.

Late binding of dynamische koppeling

Bij late binding wordt de functieaanroep tijdens runtime opgelost. Daarom bepaalt de compiler het type object tijdens runtime en bindt vervolgens de functieaanroep.


Regels voor virtuele functie

Java-architectuur
  • Virtuele functies moeten lid zijn van een bepaalde klasse.
  • Virtuele functies kunnen geen statische leden zijn.
  • Ze zijn toegankelijk via objectaanwijzers.
  • Ze kunnen een vriend van een andere klas zijn.
  • Een virtuele functie moet in de basisklasse worden gedefinieerd, ook al wordt deze niet gebruikt.
  • De prototypes van een virtuele functie van de basisklasse en alle afgeleide klassen moeten identiek zijn. Als de twee functies met dezelfde naam maar verschillende prototypes zijn, zal C++ ze als de overbelaste functies beschouwen.
  • We kunnen geen virtuele constructor hebben, maar we kunnen wel een virtuele destructor hebben
  • Neem de situatie waarin we het virtuele trefwoord niet gebruiken.
 #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;>

Uitgang:

 Value of x is : 5 

In het bovenstaande voorbeeld is * a de aanwijzer van de basisklasse. De aanwijzer heeft alleen toegang tot de leden van de basisklasse, maar niet tot de leden van de afgeleide klasse. Hoewel C++ de basisaanwijzer toestaat om naar elk object te verwijzen dat is afgeleid van de basisklasse, heeft het geen directe toegang tot de leden van de afgeleide klasse. Daarom is er behoefte aan een virtuele functie waarmee de basisaanwijzer toegang kan krijgen tot de leden van de afgeleide klasse.

C++ virtuele functie Voorbeeld

Laten we het eenvoudige voorbeeld bekijken van de virtuele C++-functie die wordt gebruikt om de afgeleide klasse in een programma aan te roepen.

 #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;>

Uitgang:

 Derived Class is invoked 

Puur virtuele functie

  • Een virtuele functie wordt niet gebruikt voor het uitvoeren van welke taak dan ook. Het dient alleen als tijdelijke aanduiding.
  • Als de functie geen definitie heeft, staat een dergelijke functie bekend als ' niets doen ' functie.
  • De ' niets doen ' functie staat bekend als a puur virtuele functie . Een puur virtuele functie is een functie die is gedeclareerd in de basisklasse en die geen definitie heeft ten opzichte van de basisklasse.
  • Een klasse die de pure virtuele functie bevat, kan niet worden gebruikt om de eigen objecten te declareren; dergelijke klassen staan ​​bekend als abstracte basisklassen.
  • Het hoofddoel van de basisklasse is om de eigenschappen aan de afgeleide klassen te verschaffen en om de basiswijzer te creëren die wordt gebruikt voor het bereiken van het runtime-polymorfisme.

Pure virtuele functie kan worden gedefinieerd als:

 virtual void display() = 0; 

Laten we een eenvoudig voorbeeld bekijken:

Hoe te updaten in Java
 #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();>

In het bovenstaande voorbeeld bevat de basisklasse de puur virtuele functie. Daarom is de basisklasse een abstracte basisklasse. We kunnen het object van de basisklasse niet maken.