logo

C++ virtuali funkcija

  • C++ virtuali funkcija yra pagrindinės klasės nario funkcija, kurią iš naujo apibrėžiate išvestinėje klasėje. Jis deklaruojamas naudojant virtualų raktinį žodį.
  • Jis naudojamas norint nurodyti kompiliatoriui atlikti dinaminį susiejimą arba vėlyvą funkcijos susiejimą.
  • Norint nurodyti visus skirtingų klasių objektus, reikia naudoti vieną žymeklį. Taigi, mes sukuriame žymeklį į bazinę klasę, kuri nurodo visus išvestinius objektus. Bet kai pagrindinės klasės rodyklėje yra išvestinio klasės objekto adresas, visada vykdoma pagrindinės klasės funkcija. Šią problemą galima išspręsti tik naudojant „virtualią“ funkciją.
  • „Virtualus“ yra raktinis žodis, einantis prieš įprastą funkcijos deklaraciją.
  • Kai funkcija tampa virtuali, C++ nustato, kuri funkcija turi būti iškviesta vykdymo metu, atsižvelgiant į objekto tipą, kurį nurodo pagrindinės klasės žymeklis.

Vėlyvas susiejimas arba dinaminis susiejimas

Vėlyvoje susiejimo funkcijos iškvietimas išsprendžiamas vykdymo metu. Todėl kompiliatorius nustato objekto tipą vykdymo metu ir susieja funkcijos iškvietimą.


Virtualios funkcijos taisyklės

išmokti seleno
  • Virtualios funkcijos turi būti tam tikros klasės nariai.
  • Virtualios funkcijos negali būti statiniai nariai.
  • Jie pasiekiami per objektų rodykles.
  • Jie gali būti kitos klasės draugai.
  • Virtuali funkcija turi būti apibrėžta pagrindinėje klasėje, net jei ji nenaudojama.
  • Bazinės klasės ir visų išvestinių klasių virtualios funkcijos prototipai turi būti identiški. Jei dvi funkcijos turi tą patį pavadinimą, bet skiriasi prototipais, C++ laikys jas perkrautomis funkcijomis.
  • Negalime turėti virtualaus konstruktoriaus, bet galime turėti virtualų naikintoją
  • Apsvarstykite situaciją, kai nenaudojame virtualaus raktinio žodžio.
 #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;>

Išvestis:

 Value of x is : 5 

Aukščiau pateiktame pavyzdyje * a yra pagrindinės klasės rodyklė. Rodyklė gali pasiekti tik bazinės klasės narius, bet ne išvestinės klasės narius. Nors C++ leidžia bazinei žymekliui nukreipti į bet kurį objektą, gautą iš bazinės klasės, jis negali tiesiogiai pasiekti išvestinės klasės narių. Todėl reikia virtualios funkcijos, kuri leistų baziniam žymekliui pasiekti išvestinės klasės narius.

C++ virtualios funkcijos pavyzdys

Pažiūrėkime paprastą C++ virtualios funkcijos pavyzdį, naudojamą išvestinei klasei programoje iškviesti.

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

Išvestis:

 Derived Class is invoked 

Gryna virtuali funkcija

  • Virtuali funkcija nenaudojama jokiai užduočiai atlikti. Jis naudojamas tik kaip rezervuota vieta.
  • Kai funkcija neturi apibrėžimo, tokia funkcija vadinama ' nieko nedaryk ' funkcija.
  • ' nieko nedaryk Funkcija žinoma kaip a gryna virtuali funkcija . Gryna virtuali funkcija yra funkcija, deklaruota bazinėje klasėje, kuri neturi apibrėžimo, palyginti su bazine klase.
  • Klasė, kurioje yra gryna virtuali funkcija, negali būti naudojama deklaruoti savo objektus, tokios klasės yra žinomos kaip abstrakčios bazinės klasės.
  • Pagrindinis pagrindinės klasės tikslas yra pateikti požymius išvestinėms klasėms ir sukurti bazinę žymeklį, naudojamą vykdymo laiko polimorfizmui pasiekti.

Gryna virtuali funkcija gali būti apibrėžta taip:

 virtual void display() = 0; 

Pažiūrėkime paprastą pavyzdį:

šriftas gimp
 #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();>

Aukščiau pateiktame pavyzdyje bazinėje klasėje yra gryna virtuali funkcija. Todėl pagrindinė klasė yra abstrakti bazinė klasė. Negalime sukurti pagrindinės klasės objekto.