Kuidas rakendada virtuaalset funktsiooni C ++ -s?



See artikkel tutvustab teile veel ühte programmeerimiskontseptsiooni, mis on virtuaalne funktsioon C ++ -s. Kontseptsiooni toetab demonstratsioon.

Virtuaalne funktsioon C ++ on baasklassi liige, mille määratleme tuletatud klassis uuesti. See artikkel aitab teil kontseptsiooni üksikasjalikult uurida. Järgmisi näpunäiteid käsitletakse selles artiklis,

Alustame selle artikliga virtuaalsete funktsioonide kohta C ++ -s



Mis on virtuaalne funktsioon?

Virtuaalne funktsioon on baasklassi liige, mille tuletatud klassis määratleme uuesti. See deklareeritakse virtuaalse märksõna abil. Kui virtuaalset funktsiooni sisaldav klass on päritud, määratleb tuletatud klass virtuaalse funktsiooni oma vajadustele vastavalt.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse



Reeglid virtuaalsele funktsioonile C ++ versioonis:

  • Need on alati määratletud baasklassis ja alistatud tuletatud klassis, kuid tuletatud klassis pole see kohustuslik alistada.
  • Virtuaalfunktsioonid tuleb deklareerida klassi avalikus jaotises.
  • Need ei saa olla staatilised ega sõbrafunktsioonid ega ka teise klassi virtuaalsed funktsioonid.
  • Käitusaja polümorfismi saavutamiseks tuleks virtuaalsetele funktsioonidele juurde pääseda osuti abil.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse.

Mis on siduv?

Funktsioonide sidumine tähendab, et kõikjal, kus on funktsioonikõne, peab kompilaator teadma, millise funktsiooni määratlusega see peaks sobima. See sõltub iga funktsioonideklaratsiooni allkirjast ja tehtud ülesannetest. Samuti peab kompilaator teadma, et kui funktsioonikõne ja õige definitsiooni valimine sobitatakse omavahel.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse



Varajane köitmine

Varajane sidumine on nähtus, kus otsus erinevate funktsioonikõnede sobitamiseks toimub kompileerimise ajal ise ja kompilaator seob lingi otse aadressidega. Seda nimetatakse ka staatiliseks sidumiseks või kompileerimisajaga sidumiseks.

  • Nagu me teame, kirjutame koodi kõrgetasemelises keeles
  • Seejärel teisendab kompilaator selle madalaks keeleks, millest arvuti aru saab, enamasti kompileerimise ajal masinakeeleks
  • Varases sidumises esitab kompilaator funktsiooni väljakutse käsu otse funktsiooni deklaratsiooni käsu aadressi
  • Seega, nagu nimigi ütleb, toimub sidumine väga varakult enne programmi käivitamist.

Näide

#include nimeruumi kasutamine std class Animals {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <heli () // varajane siduv tagastus 0}

Väljund

Väljund- virtuaalne funktsioon C ++ keeles - Edureka

täpsustused ioon
Selles näites lõime kursori a vanematele klassidele Loomad. Seejärel kirjutades a = & c, hakkas osuti ‘a’ viitama klassi Cats objektile c.
a -> heli () - funktsiooni heli () kutsumisel, mis on mõlemas klassis kursori 'a' abil, kutsuti üles vanema klassi funktsioon, isegi kui kursor viitab klassi Kassid objektile .

java numbrite summa

Selle põhjuseks on varajane sidumine. Me teame, et ‘a’ on vanemaklassi kursor, mis viitab lapseklassi objektile. Kuna varajane sidumine toimub kompileerimise ajal, siis kui kompilaator nägi, et 'a' on vanema klassi osuti, sobitas ta kõne vanemklassi funktsiooniga 'sound ()', ilma et oleks vaja kursori objekti viitab.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse

Hiline köitmine

Hilise sidumise korral tuvastab kompilaator objekti käitusajal ja sobitab seejärel funktsioonikõne õige funktsiooniga. Seda tuntakse ka kui dünaamilist sidumist või käitamise ajal sidumist.

Hilise sidumise ülaltoodud probleemis võib lahendada virtuaalse märksõna kasutamine baasklassis. Vaatame, kuidas see juhtub, kasutades ülaltoodud näidet ennast, kuid lisades ainult virtuaalse märksõna.

Näide

mis on java mvc
#include nimeruumi kasutamine std class Animals {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <heli () tagastus 0}

Väljund

Selgitus
Siin muudetakse põhiklassi funktsiooniheli () virtuaalseks, seega teeb kompilaator selle funktsiooni jaoks hilise sidumise. Nüüd sobitatakse funktsiooni sound () funktsioonikõne funktsiooni määratlusega käitusajal. Kuna kompilaator tuvastab nüüd osuti ‘a’ viidatuna tuletatud klassi Cats objektile ‘c’, kutsub ta klassi Cats funktsiooni sound ().

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse

Puht virtuaalne funktsioon

Puht virtuaalne funktsioon C ++ -s on virtuaalne funktsioon, mille jaoks meil pole rakendust, vaid deklareerime selle. Puht virtuaalne funktsioon deklareeritakse, määrates deklaratsioonis 0.

virtuaalne tühine heli () = 0

Siin on heli () puhas virtuaalne fuktsioon.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse

Abstraktne klass

Abstraktne klass on määratletud kui klass, millel on üks või mitu puhast virtuaalset funktsiooni. Nagu eespool selgitatud, on puhas virtuaalne funktsioon virtuaalse liikme funktsioon, mis on märgitud rakendusteta. Klassis pakutava teabe, sealhulgas mis tahes baasklasside, rakendamine pole võimalik. Abstraktne klass on tuntud ka kui abstraktne põhiklass.

Näide

#include nimeruumi kasutamine std klass Töötaja // abstraktne baasklass {virtual int getSalary () = 0 // puhas virtuaalne funktsioon} klass Employee_1: public Employee {int palk public: Employee_1 (int s) {palk = s} int getSalary () {tagastuspalk}} klass Töötaja_2: avalik Töötaja {int palk avalik: Töötaja_2 (int t) {palk = t} int getSalary () {tagastuspalk}} int peamine () {Töötaja_1 e1 (5000) Töötaja_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 } 

Väljund

Selgitus
Funktsioon ‘getSalary ()’ klassis Töötaja on puhas virtuaalne funktsioon. Kuna Employee klass sisaldab puhast virtuaalset funktsiooni, on see seetõttu abstraktne baasklass.
Kuna alamklassides on määratletud puhas virtuaalne funktsioon, on funktsioon ‘getSalary ()’ määratletud nii töötaja klassi alamklassides, st töötaja_1 kui ka töötaja_2.

Selle artikliga C ++ virtuaalsete funktsioonide kohta jätkatakse

Näide virtuaalsest funktsioonist

#include nimeruumi standardklassi baasi kasutamine {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 ()}

Väljund

kuidas muuta topelt int jaavaks

Selgitus
Funktsiooni function_1 () jaoks nimetatakse funktsiooni põhiklassi versiooni, tuletatud klassis tühistatakse funktsioon_2 (), nii et tuletatud klassi versiooni nimetatakse, funktsiooni_3 () tuletatud klassis ei tühistata ja see on virtuaalne funktsioon, nii et kutsutakse baasklassi versiooni, samamoodi ei tühistata funktsiooni_4 (), nii et kutsutakse baasklassi versiooni.

Seega oleme jõudnud selle artikli lõppu, mis käsitleb virtuaalset funktsiooni C ++ -s. Kui soovite rohkem teada saada, vaadake järgmist autor Edureka, usaldusväärne veebiõppe ettevõte. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud selleks, et õpetada teid nii Java põhiliste kui ka edasijõudnute kontseptsioonide jaoks koos erinevate Java-raamistikega nagu Hibernate & Spring.

Kas teil on meile küsimus? Palun mainige seda selle blogi kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.