logo

C++ virtuaalinen toiminto

  • C++-virtuaalifunktio on perusluokan jäsenfunktio, jonka määrität uudelleen johdetussa luokassa. Se ilmoitetaan käyttämällä virtuaalista avainsanaa.
  • Sitä käytetään käskemään kääntäjää suorittamaan funktiolle dynaaminen linkitys tai myöhäinen sidonta.
  • On välttämätöntä käyttää yhtä osoitinta viitattaessa kaikkiin eri luokkiin kuuluviin objekteihin. Joten luomme osoittimen perusluokkaan, joka viittaa kaikkiin johdettuihin objekteihin. Mutta kun perusluokan osoitin sisältää johdetun luokkaobjektin osoitteen, se suorittaa aina perusluokkafunktion. Tämä ongelma voidaan ratkaista vain käyttämällä 'virtuaalista' toimintoa.
  • 'Virtuaali' on avainsana, joka edeltää funktion normaalia määritystä.
  • Kun funktio on tehty virtuaaliseksi, C++ määrittää, mikä funktio on kutsuttava ajon aikana perusluokan osoittimen osoittaman objektin tyypin perusteella.

Myöhäinen sidonta tai dynaaminen linkitys

Myöhässä sidontatoiminnon kutsu ratkaistaan ​​suorituksen aikana. Siksi kääntäjä määrittää objektin tyypin ajon aikana ja sitoo sitten funktiokutsun.


Virtuaalifunktion säännöt

java sopimusten nimeäminen
  • Virtuaalifunktioiden on oltava jonkin luokan jäseniä.
  • Virtuaalifunktiot eivät voi olla staattisia jäseniä.
  • Niihin pääsee objektiosoittimien kautta.
  • He voivat olla toisen luokan ystäviä.
  • Virtuaalifunktio on määritettävä perusluokassa, vaikka sitä ei käytetä.
  • Perusluokan virtuaalisen funktion prototyyppien ja kaikkien johdettujen luokkien tulee olla identtisiä. Jos kahdella funktiolla on sama nimi, mutta eri prototyypit, C++ pitää niitä ylikuormitettuina funktioina.
  • Meillä ei voi olla virtuaalista rakentajaa, mutta meillä voi olla virtuaalinen tuhoaja
  • Harkitse tilannetta, kun emme käytä virtuaalista avainsanaa.
 #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;>

Lähtö:

 Value of x is : 5 

Yllä olevassa esimerkissä * a on perusluokan osoitin. Osoitin voi käyttää vain perusluokan jäseniä, mutta ei johdetun luokan jäseniä. Vaikka C++ sallii perusosoittimen osoittaa mihin tahansa perusluokasta johdettuihin objekteihin, se ei voi käyttää suoraan johdetun luokan jäseniä. Siksi tarvitaan virtuaalista toimintoa, joka sallii perusosoittimen pääsyn johdetun luokan jäseniin.

C++-virtuaalifunktio Esimerkki

Katsotaanpa yksinkertainen esimerkki C++-virtuaalifunktiosta, jota käytetään johdetun luokan kutsumiseen ohjelmassa.

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

Lähtö:

 Derived Class is invoked 

Puhdas virtuaalinen toiminto

  • Virtuaalitoimintoa ei käytetä minkään tehtävän suorittamiseen. Se toimii vain paikkamerkkinä.
  • Kun funktiolla ei ole määritelmää, sellainen funktio tunnetaan nimellä ' Älä tee mitään '-toiminto.
  • ' Älä tee mitään '-funktio tunnetaan nimellä a puhdas virtuaalinen toiminto . Puhdas virtuaalifunktio on perusluokassa ilmoitettu funktio, jolla ei ole määritelmää perusluokkaan nähden.
  • Pelkän virtuaalifunktion sisältävää luokkaa ei voida käyttää omien objektien ilmoittamiseen, vaan sellaisia ​​luokkia kutsutaan abstrakteiksi perusluokiksi.
  • Perusluokan päätavoitteena on tarjota ominaisuudet johdetuille luokille ja luoda perusosoitin, jota käytetään ajonaikaisen polymorfismin saavuttamiseen.

Puhdas virtuaalifunktio voidaan määritellä seuraavasti:

 virtual void display() = 0; 

Katsotaanpa yksinkertainen esimerkki:

tostring javassa
 #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();>

Yllä olevassa esimerkissä perusluokka sisältää puhtaan virtuaalifunktion. Siksi perusluokka on abstrakti perusluokka. Emme voi luoda perusluokan objektia.