- En virtuell C++-funktion är en medlemsfunktion i basklassen som du omdefinierar i en härledd klass. Det deklareras med hjälp av det virtuella nyckelordet.
- Den används för att berätta för kompilatorn att utföra dynamisk länkning eller sen bindning av funktionen.
- Det är nödvändigt att använda den enda pekaren för att referera till alla objekt i de olika klasserna. Så vi skapar pekaren till basklassen som refererar till alla härledda objekt. Men när basklasspekaren innehåller adressen till det härledda klassobjektet, körs alltid basklassfunktionen. Det här problemet kan endast lösas genom att använda den 'virtuella' funktionen.
- En 'virtuell' är ett nyckelord som föregår den normala deklarationen av en funktion.
- När funktionen görs virtuell bestämmer C++ vilken funktion som ska anropas vid körning baserat på typen av objekt som pekas av basklasspekaren.
Sen bindning eller dynamisk länkning
I sen bindning löses funktionsanrop under körning. Därför bestämmer kompilatorn typen av objekt vid körning och binder sedan funktionsanropet.
Regler för virtuell funktion
Hur man laddar ner youtube video vlc
- Virtuella funktioner måste vara medlemmar i någon klass.
- Virtuella funktioner kan inte vara statiska medlemmar.
- De nås via objektpekare.
- De kan vara kompisar till en annan klass.
- En virtuell funktion måste definieras i basklassen, även om den inte används.
- Prototyperna för en virtuell funktion för basklassen och alla härledda klasser måste vara identiska. Om de två funktionerna har samma namn men olika prototyper, kommer C++ att betrakta dem som de överbelastade funktionerna.
- Vi kan inte ha en virtuell konstruktör, men vi kan ha en virtuell destruktör
- Tänk på situationen när vi inte använder det virtuella nyckelordet.
#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;>
Produktion:
Value of x is : 5
I exemplet ovan är * a basklasspekaren. Pekaren kan bara komma åt basklassmedlemmarna men inte medlemmarna i den härledda klassen. Även om C++ tillåter baspekaren att peka på alla objekt som härletts från basklassen, kan den inte direkt komma åt medlemmarna i den härledda klassen. Därför finns det ett behov av virtuell funktion som tillåter baspekaren att komma åt medlemmarna i den härledda klassen.
C++ virtuell funktion Exempel
Låt oss se det enkla exemplet på C++ virtuell funktion som används för att anropa den härledda klassen i ett 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;>
Produktion:
Derived Class is invoked
Ren virtuell funktion
- En virtuell funktion används inte för att utföra någon uppgift. Den fungerar bara som en platshållare.
- När funktionen inte har någon definition kallas denna funktion ' göra ingenting ' funktion.
- den ' göra ingenting ' funktion är känd som en ren virtuell funktion . En ren virtuell funktion är en funktion som deklareras i basklassen och som inte har någon definition i förhållande till basklassen.
- En klass som innehåller den rena virtuella funktionen kan inte användas för att deklarera sina egna objekt, sådana klasser är kända som abstrakta basklasser.
- Huvudsyftet med basklassen är att tillhandahålla egenskaperna till de härledda klasserna och att skapa baspekaren som används för att uppnå körtidspolymorfismen.
Ren virtuell funktion kan definieras som:
virtual void display() = 0;
Låt oss se ett enkelt exempel:
gratis vs gratis
#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 exemplet ovan innehåller basklassen den rena virtuella funktionen. Därför är basklassen en abstrakt basklass. Vi kan inte skapa objektet för basklassen.