logo

Funcție virtuală C++

  • O funcție virtuală C++ este o funcție membru în clasa de bază pe care o redefiniți într-o clasă derivată. Este declarat folosind cuvântul cheie virtual.
  • Este folosit pentru a spune compilatorului să efectueze o legătură dinamică sau o legare tardivă a funcției.
  • Este necesar să se folosească un singur indicator pentru a se referi la toate obiectele diferitelor clase. Deci, creăm indicatorul către clasa de bază care se referă la toate obiectele derivate. Dar, când pointerul clasei de bază conține adresa obiectului clasa derivată, execută întotdeauna funcția clasei de bază. Această problemă poate fi rezolvată numai folosind funcția „virtuală”.
  • Un „virtual” este un cuvânt cheie care precede declararea normală a unei funcții.
  • Când funcția devine virtuală, C++ determină ce funcție trebuie invocată în timpul execuției pe baza tipului de obiect indicat de pointerul clasei de bază.

Legare tardivă sau legare dinamică

În timpul execuției, apelul funcției de legare este rezolvat. Prin urmare, compilatorul determină tipul de obiect în timpul execuției și apoi leagă apelul funcției.


Regulile funcției virtuale

comanda în nodul js
  • Funcțiile virtuale trebuie să fie membri ai unei clase.
  • Funcțiile virtuale nu pot fi membri statici.
  • Ele sunt accesate prin indicatori de obiect.
  • Pot fi prieteni de altă clasă.
  • O funcție virtuală trebuie definită în clasa de bază, chiar dacă nu este utilizată.
  • Prototipurile unei funcții virtuale a clasei de bază și toate clasele derivate trebuie să fie identice. Dacă cele două funcții au același nume, dar prototipuri diferite, C++ le va considera ca fiind funcțiile supraîncărcate.
  • Nu putem avea un constructor virtual, dar putem avea un destructor virtual
  • Luați în considerare situația în care nu folosim cuvântul cheie virtual.
 #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;>

Ieșire:

 Value of x is : 5 

În exemplul de mai sus, * a este indicatorul clasei de bază. Pointerul poate accesa doar membrii clasei de bază, dar nu și membrii clasei derivate. Deși C++ permite indicatorului de bază să indice orice obiect derivat din clasa de bază, nu poate accesa direct membrii clasei derivate. Prin urmare, este nevoie de o funcție virtuală care să permită pointerului de bază să acceseze membrii clasei derivate.

Funcție virtuală C++ Exemplu

Să vedem exemplul simplu de funcție virtuală C++ folosită pentru a invoca clasa derivată într-un 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;>

Ieșire:

 Derived Class is invoked 

Funcție virtuală pură

  • O funcție virtuală nu este utilizată pentru a efectua nicio sarcină. Acesta servește doar ca substituent.
  • Când funcția nu are nicio definiție, o astfel de funcție este cunoscută sub numele de ' nu face nimic 'funcția.
  • ' nu face nimic 'funcția este cunoscută ca a funcție virtuală pură . O funcție virtuală pură este o funcție declarată în clasa de bază care nu are nicio definiție în raport cu clasa de bază.
  • O clasă care conține funcția virtuală pură nu poate fi folosită pentru a declara obiectele proprii, astfel de clase sunt cunoscute ca clase de bază abstracte.
  • Obiectivul principal al clasei de bază este de a oferi trăsăturile claselor derivate și de a crea indicatorul de bază utilizat pentru realizarea polimorfismului de rulare.

Funcția virtuală pură poate fi definită ca:

 virtual void display() = 0; 

Să vedem un exemplu simplu:

java convertește un întreg în șir
 #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();>

În exemplul de mai sus, clasa de bază conține funcția virtuală pură. Prin urmare, clasa de bază este o clasă de bază abstractă. Nu putem crea obiectul clasei de bază.