logo

C++ virtualna funkcija

  • C++ virtualna funkcija je funkcija član u osnovnoj klasi koju redefinirate u izvedenoj klasi. Deklariše se pomoću ključne riječi virtual.
  • Koristi se da se prevoditelju kaže da izvrši dinamičko povezivanje ili kasno povezivanje funkcije.
  • Postoji potreba za korištenjem jednog pokazivača za upućivanje na sve objekte različitih klasa. Dakle, stvaramo pokazivač na osnovnu klasu koja se odnosi na sve izvedene objekte. Ali, kada pokazivač osnovne klase sadrži adresu objekta izvedene klase, uvijek izvršava funkciju osnovne klase. Ovaj se problem može riješiti samo korištenjem 'virtualne' funkcije.
  • 'Virtualno' je ključna riječ koja prethodi normalnoj deklaraciji funkcije.
  • Kada je funkcija virtualna, C++ određuje koja će se funkcija pozvati tijekom izvođenja na temelju tipa objekta na koji pokazuje pokazivač osnovne klase.

Kasno vezanje ili dinamičko povezivanje

U kasnom povezivanju poziv funkcije se rješava tijekom vremena izvođenja. Stoga prevoditelj određuje vrstu objekta tijekom izvođenja, a zatim veže poziv funkcije.


Pravila virtualne funkcije

brzina prijenosa u arduinu
  • Virtualne funkcije moraju biti članovi neke klase.
  • Virtualne funkcije ne mogu biti statički članovi.
  • Pristupa im se putem pokazivača na objekte.
  • Oni mogu biti prijatelj drugog razreda.
  • Virtualna funkcija mora biti definirana u osnovnoj klasi, iako se ne koristi.
  • Prototipovi virtualne funkcije osnovne klase i svih izvedenih klasa moraju biti identični. Ako su dvije funkcije s istim imenom, ali različitim prototipovima, C++ će ih smatrati preopterećenim funkcijama.
  • Ne možemo imati virtualni konstruktor, ali možemo imati virtualni destruktor
  • Razmotrimo situaciju kada ne koristimo ključnu riječ 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;>

Izlaz:

 Value of x is : 5 

U gornjem primjeru, * a je pokazivač osnovne klase. Pokazivač može pristupiti samo članovima osnovne klase, ali ne i članovima izvedene klase. Iako C++ dopušta osnovnom pokazivaču da pokazuje na bilo koji objekt izveden iz osnovne klase, ne može izravno pristupiti članovima izvedene klase. Stoga postoji potreba za virtualnom funkcijom koja omogućuje osnovnom pokazivaču pristup članovima izvedene klase.

Primjer C++ virtualne funkcije

Pogledajmo jednostavan primjer C++ virtualne funkcije koja se koristi za pozivanje izvedene klase u 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;>

Izlaz:

 Derived Class is invoked 

Čista virtualna funkcija

  • Virtualna funkcija ne koristi se za obavljanje bilo kojeg zadatka. Služi samo kao rezervirano mjesto.
  • Kada funkcija nema definiciju, takva funkcija je poznata kao ' učiniti ništa ' funkcija.
  • ' učiniti ništa ' funkcija je poznata kao a čista virtualna funkcija . Čista virtualna funkcija je funkcija deklarirana u osnovnoj klasi koja nema definiciju u odnosu na osnovnu klasu.
  • Klasa koja sadrži čistu virtualnu funkciju ne može se koristiti za deklariranje vlastitih objekata, takve klase su poznate kao apstraktne osnovne klase.
  • Glavni cilj osnovne klase je pružiti osobine izvedenim klasama i stvoriti osnovni pokazivač koji se koristi za postizanje polimorfizma vremena izvođenja.

Čista virtualna funkcija može se definirati kao:

 virtual void display() = 0; 

Pogledajmo jednostavan primjer:

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

U gornjem primjeru, osnovna klasa sadrži čistu virtualnu funkciju. Stoga je osnovna klasa apstraktna osnovna klasa. Ne možemo kreirati objekt osnovne klase.