logo

C++ virtuālā funkcija

  • C++ virtuālā funkcija ir pamatklases dalībnieka funkcija, kuru atkārtoti definējat atvasinātajā klasē. Tas tiek deklarēts, izmantojot virtuālo atslēgvārdu.
  • To izmanto, lai liktu kompilatoram veikt funkcijas dinamisku saiti vai vēlu saistīšanu.
  • Ir nepieciešams izmantot vienu rādītāju, lai atsauktos uz visiem dažādu klašu objektiem. Tātad, mēs izveidojam rādītāju uz bāzes klasi, kas attiecas uz visiem atvasinātajiem objektiem. Bet, ja bāzes klases rādītājs satur atvasinātā klases objekta adresi, vienmēr izpilda bāzes klases funkciju. Šo problēmu var atrisināt, tikai izmantojot funkciju “virtuālā”.
  • 'Virtuāls' ir atslēgvārds pirms parastās funkcijas deklarācijas.
  • Kad funkcija ir virtuāla, C++ nosaka, kura funkcija ir jāizsauc izpildlaikā, pamatojoties uz objekta veidu, uz kuru norāda bāzes klases rādītājs.

Vēlīna saistīšana vai dinamiskā saite

Vēlīnā saistīšanas funkcijas izsaukums tiek atrisināts izpildlaikā. Tāpēc kompilators izpildes laikā nosaka objekta veidu un pēc tam saista funkcijas izsaukumu.


Virtuālās funkcijas noteikumi

java scan.nextstring
  • Virtuālajām funkcijām ir jābūt kādas klases dalībniekiem.
  • Virtuālās funkcijas nevar būt statiski dalībnieki.
  • Tiem var piekļūt, izmantojot objektu rādītājus.
  • Viņi var būt citas klases draugs.
  • Virtuālā funkcija ir jādefinē bāzes klasē, pat ja tā netiek izmantota.
  • Pamatklases un visu atvasināto klašu virtuālās funkcijas prototipiem jābūt identiskiem. Ja abām funkcijām ir vienāds nosaukums, bet dažādi prototipi, C++ tās uzskatīs par pārslogotām funkcijām.
  • Mums nevar būt virtuāls konstruktors, bet mums var būt virtuāls destruktors
  • Apsveriet situāciju, kad neizmantojam virtuālo atslēgvārdu.
 #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;>

Izvade:

 Value of x is : 5 

Iepriekš minētajā piemērā * a ir bāzes klases rādītājs. Rādītājs var piekļūt tikai bāzes klases dalībniekiem, bet ne atvasinātās klases dalībniekiem. Lai gan C++ ļauj bāzes rādītājam norādīt uz jebkuru objektu, kas atvasināts no bāzes klases, tas nevar tieši piekļūt atvasinātās klases dalībniekiem. Tāpēc ir nepieciešama virtuāla funkcija, kas ļauj bāzes rādītājam piekļūt atvasinātās klases dalībniekiem.

C++ virtuālās funkcijas piemērs

Apskatīsim vienkāršu C++ virtuālās funkcijas piemēru, ko izmanto, lai programmā izsauktu atvasināto klasi.

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

Izvade:

 Derived Class is invoked 

Tīra virtuāla funkcija

  • Virtuālā funkcija netiek izmantota neviena uzdevuma veikšanai. Tas kalpo tikai kā vietturis.
  • Ja funkcijai nav definīcijas, šādu funkciju sauc par ' neko nedarīt ' funkcija.
  • ' neko nedarīt Funkcija ir pazīstama kā a tīra virtuāla funkcija . Tīra virtuālā funkcija ir funkcija, kas deklarēta bāzes klasē un kurai nav definīcijas attiecībā pret bāzes klasi.
  • Klasi, kas satur tīru virtuālo funkciju, nevar izmantot, lai deklarētu savus objektus, šādas klases sauc par abstraktām bāzes klasēm.
  • Pamatklases galvenais mērķis ir nodrošināt atvasinātajām klasēm pazīmes un izveidot bāzes rādītāju, kas tiek izmantots izpildlaika polimorfisma sasniegšanai.

Tīri virtuālo funkciju var definēt šādi:

 virtual void display() = 0; 

Apskatīsim vienkāršu piemēru:

java tipa konvertēšana un liešana
 #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();>

Iepriekš minētajā piemērā bāzes klase satur tīru virtuālo funkciju. Tāpēc bāzes klase ir abstrakta bāzes klase. Mēs nevaram izveidot bāzes klases objektu.