Kā ieviest virtuālo funkciju C ++?

Šis raksts jūs iepazīstinās ar vēl vienu programmēšanas koncepciju, kas ir virtuālā funkcija C ++. Koncepciju atbalstīs demonstrācija.

Virtuāla funkcija C ++ ir dalībnieka funkcija bāzes klasē, kuru mēs atkārtoti definējam atvasinātajā klasē. Šis raksts palīdzēs detalizēti izpētīt koncepciju. Šajā rakstā tiks apskatīti šādi rādītāji,

Tāpēc sāksim ar šo rakstu par virtuālo funkciju C ++



Kas ir virtuālā funkcija?

Virtuālā funkcija ir dalībnieka funkcija bāzes klasē, kuru mēs atkārtoti definējam atvasinātajā klasē. Tas tiek deklarēts, izmantojot virtuālo atslēgvārdu. Kad klase, kas satur virtuālo funkciju, tiek mantota, atvasinātā klase virtuālo funkciju pārdefinē atbilstoši savām vajadzībām.

Turpinot šo rakstu par virtuālo funkciju C ++

Virtuālās funkcijas C ++ noteikumi:

  • Tie vienmēr tiek definēti bāzes klasē un tiek ignorēti atvasinātajā klasē, taču atceltajā klasē nav obligāti jāignorē.
  • Virtuālās funkcijas jādeklarē klases publiskajā sadaļā.
  • Tās nevar būt statiskas vai drauga funkcijas, kā arī citas klases virtuālās funkcijas.
  • Virtuālajām funkcijām vajadzētu piekļūt, izmantojot rādītāju, lai sasniegtu darbības laika polimorfismu.

Turpinot šo rakstu par virtuālo funkciju C ++.

Kas ir saistošs?

Funkciju saistīšana nozīmē, ka visur, kur ir funkciju izsaukums, kompilatoram jāzina, kuras funkcijas definīcijai tas būtu jāpielāgo. Tas ir atkarīgs no katras funkcijas deklarācijas paraksta un veiktajiem uzdevumiem. Kompilatoram arī jāzina, ka tad, kad šī funkciju izsaukuma saskaņošana ar pareizas definīcijas izvēli notiks.

Turpinot šo rakstu par virtuālo funkciju C ++

Agrīna saistīšana

Agrīna saistīšana ir parādība, kurā lēmums saskaņot dažādus funkciju izsaukumus notiek pašā sastādīšanas laikā, un kompilators saista saiti tieši ar adresēm. Tas ir pazīstams arī kā statiskā saistīšana vai sastādīšanas laika saistīšana.

  • Kā mēs zinām, mēs rakstām kodu augsta līmeņa valodā
  • Tad kompilators to pārvērš zema līmeņa valodā, kuru dators var saprast, galvenokārt kompilācijas laikā mašīnvalodā
  • Agrīnā iesiešanā kompilators tieši norāda funkciju deklarēšanas instrukcijas funkciju izsaukuma instrukcijai
  • Tādējādi, kā norāda nosaukums, saistīšana notiek ļoti agri, pirms programma darbojas.

Piemērs

#include izmantojot nosaukumvietu std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <skaņa () // agri saistoša atgriešanās 0}

Rezultāts

Izeja - virtuālā funkcija C ++ versijā - Edureka

precizējumi jonu
Šajā piemērā mēs izveidojām rādītāju a vecāku klasei Dzīvnieki. Tad, rakstot a = & c, rādītājs ‘a’ sāka atsaukties uz kaķu klases c objektu.
a -> sound () - izsaucot funkciju sound (), kas abās klasēs atrodas ar rādītāju “a”, vecāku klases funkcija tika izsaukta, pat ja rādītājs atsaucas uz klases kaķi objektu .

atšķirība starp bigdata un hadoop

Tas ir saistīts ar agrīnu saistīšanu. Mēs zinām, ka ‘a’ ir vecāku klases rādītājs, kas attiecas uz bērnu klases objektu. Tā kā agrīna saistīšana notiek sastādīšanas laikā, tāpēc, kad sastādītājs redzēja, ka 'a' ir vecāku klases rādītājs, tas pieskaņoja zvanu vecāku klases funkcijai 'sound ()', nemeklējot objektu atsaucas uz.

Turpinot šo rakstu par virtuālo funkciju C ++

Vēlā iesiešana

Vēlā iesiešanā kompilators identificē objektu izpildlaikā un pēc tam saskaņo funkciju izsaukumu ar pareizo funkciju. To sauc arī par dinamisko saistīšanu vai izpildlaika iesiešanu.

Novēlotu saistīšanu iepriekšminētajā problēmā var atrisināt, izmantojot virtuālo atslēgvārdu bāzes klasē. Apskatīsim, kā tas notiek, izmantojot iepriekš minēto piemēru, bet pievienojot tikai virtuālo atslēgvārdu.

Piemērs

kā iziet no programmas Java
#include izmantojot nosaukumvietas std klases Dzīvnieki {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <skaņa () atgriešanās 0}

Rezultāts

Paskaidrojums
Šeit pamatklases funkciju skaņa () tiek padarīta virtuāla, tādējādi kompilators tagad veic šīs funkcijas novēlotu saistīšanu. Tagad skaņas () funkcijas izsaukums izpildes laikā tiks saskaņots ar funkcijas definīciju. Tā kā kompilators tagad identificē rādītāju ‘a’ kā atsauci uz atvasinātās klases Cats objektu ‘c’, tas sauks klases Cats skaņas () funkciju.

Turpinot šo rakstu par virtuālo funkciju C ++

Tīra virtuālā funkcija

Tīra virtuālā funkcija C ++ ir virtuāla funkcija, kurai mums nav ieviešanas, mēs to tikai deklarējam. Tīrā virtuālā funkcija tiek deklarēta, deklarācijā piešķirot 0.

virtuālā tukšuma skaņa () = 0

Šeit skaņa () ir tīra virtuālā fukcija.

Turpinot šo rakstu par virtuālo funkciju C ++

Abstrakta klase

Abstrakta klase tiek definēta kā klase ar vienu vai vairākām tīras virtuālās funkcijas. Kā paskaidrots iepriekš, tīrā virtuālā funkcija ir virtuālā dalībnieka funkcija, kas tiek atzīmēta kā bez ieviešanas. Tas nav iespējams, izmantojot klasē sniegto informāciju, ieskaitot visas pamatklases. Abstraktā klase ir pazīstama arī kā abstrakta bāzes klase.

Piemērs

#include izmantojot nosaukumvietas std klase Darbinieks // abstraktā bāzes klase {virtual int getSalary () = 0 // tīrā virtuālā funkcija} klase Employee_1: publiskais darbinieks {int alga public: Employee_1 (int s) {alga = s} int getSalary () {atgriešanās alga}} klase Darbinieks_2: valsts darbinieks {int alga publiski: Darbinieks_2 (int t) {alga = t} int getalga () {atgriešanās alga}} int galvenā () {Darbinieks_1 e1 (5000) Darbinieks_2 e2 (3000) int a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Rezultāts

Paskaidrojums
Funkcija ‘getSalary ()’ nodarbinātajā klasē ir tīra virtuālā funkcija. Tā kā Employee klasē ir tīra virtuālā funkcija, tā ir abstrakta bāzes klase.
Tā kā tīrā virtuālā funkcija ir definēta apakšklasēs, funkcija ‘getSalary ()’ ir definēta abās klases Darbinieks apakšklasēs, t.i., Darbinieks_1 un Darbinieks_2.

Turpinot šo rakstu par virtuālo funkciju C ++

Virtuālās funkcijas piemērs

#include izmantojot nosaukumvietas standarta klases bāzi {public: void function_1 () {cout<< 'base class function 1n' } virtual void function_2() { cout << 'base class function 2n' } virtual void function_3() { cout << 'base class function 3n' } virtual void function_4() { cout << 'base class function 4n' } } class derived : public base { public: void function_1() { cout << 'derived class function 1n' } void function_2() { cout << 'derived class function 2n' } void function_4(int x) { cout function_2 () ptr-> function_3 () ptr-> function_4 ()}

Rezultāts

android studio ui dizaina apmācība

Paskaidrojums
Funkcijas izsaukumam function_1 () tiek izsaukta funkcijas bāzes klases versija, atvasinātajā klasē tiek ignorēta funkcija_2 (), tāpēc tiek izsaukta atvasinātās klases versija, funkcija_3 () netiek ignorēta atvasinātajā klasē un ir virtuāla funkcija, tāpēc tiek saukta bāzes klases versija līdzīgi funkcija_4 () netiek ignorēta, tāpēc tiek izsaukta bāzes klases versija.

Tādējādi mēs esam nonākuši šī raksta par ‘Virtuālo funkciju C ++’ beigās. Ja vēlaties uzzināt vairāk, iepazīstieties ar Autors: uzticams tiešsaistes mācību uzņēmums Edureka. Edureka Java J2EE un SOA apmācības un sertifikācijas kurss ir paredzēts, lai apmācītu jūs gan galvenajiem, gan uzlabotajiem Java jēdzieniem kopā ar dažādiem Java ietvariem, piemēram, Hibernate & Spring.

Vai mums ir jautājums? Lūdzu, pieminējiet to šī emuāra komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.