logo

Navidezna funkcija C++

  • Navidezna funkcija C++ je funkcija članica v osnovnem razredu, ki jo na novo definirate v izpeljanem razredu. Deklarira se s ključno besedo virtual.
  • Uporablja se za sporočanje prevajalniku, naj izvede dinamično povezovanje ali pozno povezovanje funkcije.
  • Za sklicevanje na vse objekte različnih razredov je treba uporabiti en sam kazalec. Torej ustvarimo kazalec na osnovni razred, ki se nanaša na vse izpeljane objekte. Ko pa kazalec osnovnega razreda vsebuje naslov izpeljanega objekta razreda, vedno izvede funkcijo osnovnega razreda. To težavo je mogoče rešiti le z uporabo 'virtualne' funkcije.
  • 'Virtual' je ključna beseda pred običajno deklaracijo funkcije.
  • Ko je funkcija navidezna, C++ določi, katero funkcijo je treba poklicati v času izvajanja glede na vrsto predmeta, na katerega kaže kazalec osnovnega razreda.

Pozna vezava ali dinamična povezava

Pri poznem povezovanju je klic funkcije razrešen med izvajanjem. Zato prevajalnik med izvajanjem določi vrsto objekta in nato poveže klic funkcije.


Pravila virtualne funkcije

css spreminjanje velikosti slike
  • Virtualne funkcije morajo biti člani nekega razreda.
  • Navidezne funkcije ne morejo biti statični člani.
  • Do njih se dostopa prek kazalcev objektov.
  • Lahko so prijatelji drugega razreda.
  • Navidezna funkcija mora biti definirana v osnovnem razredu, čeprav se ne uporablja.
  • Prototipi virtualne funkcije osnovnega razreda in vseh izpeljanih razredov morajo biti identični. Če sta funkciji z enakim imenom, a različnima prototipoma, ju bo C++ obravnaval kot preobremenjeni funkciji.
  • Ne moremo imeti virtualnega konstruktorja, lahko pa imamo virtualni destruktor
  • Razmislite o situaciji, ko ne uporabljamo ključne besede 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;>

Izhod:

 Value of x is : 5 

V zgornjem primeru je * a kazalec osnovnega razreda. Kazalec lahko dostopa samo do članov osnovnega razreda, ne pa tudi do članov izpeljanega razreda. Čeprav C++ dovoljuje, da osnovni kazalec kaže na kateri koli objekt, izpeljan iz osnovnega razreda, ne more neposredno dostopati do članov izpeljanega razreda. Zato obstaja potreba po virtualni funkciji, ki omogoča osnovnemu kazalcu dostop do članov izpeljanega razreda.

Primer virtualne funkcije C++

Oglejmo si preprost primer navidezne funkcije C++, ki se uporablja za priklic izpeljanega razreda v programu.

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

Izhod:

 Derived Class is invoked 

Čista virtualna funkcija

  • Navidezna funkcija se ne uporablja za izvajanje nobene naloge. Služi le kot ograda.
  • Če funkcija nima definicije, je taka funkcija znana kot ' delati nič ' funkcijo.
  • ' delati nič ' funkcija je znana kot a čista virtualna funkcija . Čista virtualna funkcija je funkcija, deklarirana v osnovnem razredu, ki nima definicije glede na osnovni razred.
  • Razreda, ki vsebuje čisto navidezno funkcijo, ni mogoče uporabiti za deklariranje lastnih objektov, takšni razredi so znani kot abstraktni osnovni razredi.
  • Glavni cilj osnovnega razreda je zagotoviti lastnosti izpeljanim razredom in ustvariti osnovni kazalec, ki se uporablja za doseganje izvajalnega polimorfizma.

Čisto virtualno funkcijo lahko definiramo kot:

 virtual void display() = 0; 

Poglejmo preprost primer:

java pretvori celo število v niz
 #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();>

V zgornjem primeru osnovni razred vsebuje čisto virtualno funkcijo. Zato je osnovni razred abstrakten osnovni razred. Objekta osnovnega razreda ne moremo ustvariti.