Kaip įdiegti virtualią funkciją C ++?



Šis straipsnis supažindins jus su dar viena programavimo koncepcija, kuri yra virtuali funkcija C ++. Koncepciją palaikys demonstracija.

Virtuali funkcija C ++ yra pagrindinės klasės nario funkcija, kurią mes iš naujo apibrėžiame išvestinėje klasėje. Šis straipsnis padės išsamiai išnagrinėti koncepciją. Tolimesni rodyklės bus aprašyti šiame straipsnyje,

kuo skiriasi gitas ir gitubas

Taigi pradėkime nuo šio straipsnio apie virtualiąją funkciją C ++





Kas yra virtuali funkcija?

Virtuali funkcija yra pagrindinės klasės nario funkcija, kurią mes iš naujo apibrėžiame išvestinėje klasėje. Tai deklaruojama naudojant virtualų raktinį žodį. Kai klasė, kurioje yra virtuali funkcija, yra paveldima, išvestinė klasė iš naujo apibrėžia virtualiąją funkciją, kad atitiktų jos poreikius.

Toliau su šiuo straipsniu apie virtualią funkciją C ++



C ++ virtualiosios funkcijos taisyklės:

  • Jie visada apibrėžiami pagrindinėje klasėje ir yra nepaisomi išvestinėje klasėje, tačiau išvestinės klasės nepaisyti nereikia.
  • Virtualios funkcijos turi būti deklaruojamos viešoje klasės dalyje.
  • Jie negali būti statiniai ar draugo, taip pat negali būti virtualios kitos klasės funkcijos.
  • Norint pasiekti vykdymo laiko polimorfizmą, prie virtualių funkcijų reikia prisijungti naudojant žymeklį.

Toliau su šiuo straipsniu apie virtualią funkciją C ++.

Kas yra privaloma?

Funkcijų susiejimas reiškia, kad visur, kur yra funkcijos iškvietimas, kompiliatorius turi žinoti, prie kurios funkcijos apibrėžimo jis turėtų būti derinamas. Tai priklauso nuo kiekvienos funkcijos deklaracijos parašo ir atliktų priskyrimų. Be to, kompiliatorius turi žinoti, kad kai šis funkcijos iškvietimas ir teisingo apibrėžimo pasirinkimas bus suderinti.

Toliau su šiuo straipsniu apie virtualią funkciją C ++



Ankstyvas įrišimas

Ankstyvasis susiejimas yra reiškinys, kai sprendimas suderinti įvairius funkcijų iškvietimus įvyksta paties kompiliavimo metu, o kompiliatorius tiesiogiai susieja nuorodą su adresais. Jis taip pat žinomas kaip „Static Binding“ arba „Compile-time Binding“.

  • Kaip žinome, kodą rašome aukšto lygio kalba
  • Tada kompiliatorius konvertuoja tai į žemo lygio kalbą, kurią supranta kompiuteris, dažniausiai kompiliavimo kalbą kompiliavimo metu
  • Ankstyvuoju susiejimu kompiliatorius tiesiogiai pateikia funkcijos deklaravimo nurodymą funkcijos iškvietimo instrukcijai
  • Taigi, kaip rodo pavadinimas, įrišimas įvyksta labai anksti prieš paleidžiant programą.

Pavyzdys

#include naudojant vardų sritį standartinės klasės gyvūnai {public: void sound () {cout<< 'Genric animal sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cat meow' <garsas () // ankstyvas įrišimo grąžinimas 0}

Rezultatas

Išvestis - virtuali funkcija C ++ formatu - „Edureka“

patikslinimai jonų
Šiame pavyzdyje mes sukūrėme rodyklę a į tėvų klasę „Gyvūnai“. Tada užrašydamas a = & c, žymeklis „a“ pradėjo nurodyti „Cats“ klasės objektą c.
a -> garsas () - iškviečiant funkciją garsą (), esančią abiejose klasėse žymekliu „a“, tėvų klasės funkcija buvo iškviesta, net jei rodyklė nurodo klasės „Katės“ objektą .

Taip yra dėl ankstyvo įrišimo. Mes žinome, kad „a“ yra tėvų klasės rodyklė, nurodanti vaikų klasės objektą. Kadangi ankstyvasis susiejimas vyksta kompiliavimo metu, todėl, kai kompiliatorius pamatė, kad „a“ yra tėvų klasės žymeklis, jis suderino iškvietimą su „tėvų“ klasės funkcija „sound ()“, neieškodamas objekto, kur jis rodomas remiasi.

Toliau su šiuo straipsniu apie virtualią funkciją C ++

Vėlyvas įrišimas

Vėlyvuoju susiejimu kompiliatorius nustato objektą vykdymo metu ir tada suderina funkcijos iškvietimą su teisinga funkcija. Jis taip pat žinomas kaip dinaminis įrišimas arba vykdymo laiko įrišimas.

Vėlyvas susiejimas pirmiau pateiktoje problemoje gali būti išspręstas naudojant virtualų raktinį žodį pagrindinėje klasėje. Pažiūrėkime, kaip tai vyksta, naudodami patį aukščiau pateiktą pavyzdį, bet pridėdami tik virtualų raktinį žodį.

Pavyzdys

#include naudojant vardų srities standartinės klasės gyvūnus {public: virtual void sound () {cout<< 'Genric aniaml sound' << endl } } class Cats: public Animals { public: void sound() { cout << 'Cats meow' <garsas () grįžti 0}

Rezultatas

Paaiškinimas
Čia pagrindinės klasės funkcijos garsas () tampa virtualus, todėl kompiliatorius dabar atlieka vėlyvą šios funkcijos susiejimą. Dabar garso () funkcijos iškvietimas bus suderintas su funkcijos apibrėžimu vykdymo metu. Kadangi dabar kompiliatorius žymi žymeklį „a“ kaip nurodantį išvestinės klasės „Cats“ objektą „c“, jis vadins „Cats“ klasės garso () funkciją.

Toliau su šiuo straipsniu apie virtualią funkciją C ++

Gryna virtuali funkcija

Gryna virtuali funkcija C ++ yra virtuali funkcija, kuriai mes neturime įgyvendinimo, mes ją tik deklaruojame. Gryna virtuali funkcija deklaruojama priskiriant 0 deklaracijoje.

virtualus tuštumos garsas () = 0

Čia garsas () yra gryna virtuali fukcija.

Toliau su šiuo straipsniu apie virtualią funkciją C ++

Anotacija

Abstrakti klasė apibrėžiama kaip klasė, turinti vieną ar daugiau grynų virtualių funkcijų. Kaip paaiškinta aukščiau, gryna virtuali funkcija yra virtuali nario funkcija, pažymėta kaip neįdiegta. Tai neįmanoma įgyvendinti naudojant klasėje pateiktą informaciją, įskaitant pagrindines klases. Abstrakti klasė taip pat žinoma kaip abstrakti pagrindinė klasė.

Pavyzdys

#include naudojant vardų srities standartinę klasę Darbuotojas // abstrakti bazinė klasė {virtual int getSalary () = 0 // grynoji virtuali funkcija} klasė Darbuotojas_1: viešasis darbuotojas {int atlyginimas viešas: Darbuotojas_1 (int s) {atlyginimas = s} int getSalary () {grįžimo atlyginimas}} klasė Darbuotojas_2: viešasis Darbuotojas {int atlyginimas viešasis: Darbuotojas_2 (int t) {atlyginimas = t} int getSalary () {grąžinimo atlyginimas}} int pagrindinis () {Darbuotojas_1 e1 (5000) Darbuotojas_2 e2 (3000) tarpt. a, ba = e1.getSalary () b = e2.getSalary () cout<< 'Salary of Developer : ' << a << endl cout << 'Salary of Driver : ' << b << endl return 0 } 

Rezultatas

Paaiškinimas
„GetSalary ()“ funkcija „Employee“ klasėje yra gryna virtuali funkcija. Kadangi „Employee“ klasėje yra gryna virtuali funkcija, tai yra abstrakti pagrindinė klasė.
Kadangi gryna virtuali funkcija apibrėžta poklasiuose, funkcija ‘getSalary ()’ apibrėžta abiejuose klasės „Darbuotojas“ poklasiuose, t. Y. „Darbuotojas_1“ ir „Darbuotojas_2“.

Toliau su šiuo straipsniu apie virtualią funkciją C ++

Virtualios funkcijos pavyzdys

#include naudojant vardų srities standartinę klasės bazę {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 ()}

Rezultatas

Paaiškinimas
Skambinant funkcija_1 () funkcijos iškvietimui, iškviečiama pagrindinės klasės funkcijos versija, išvestinėje klasėje pakeičiama funkcija_2 (), taigi vadinama išvestine klasės versija, išvestinėje klasėje funkcija nepaisoma ir funkcija_3 () yra virtuali funkcija, todėl vadinama pagrindinės klasės versija, panašiai funkcija_4 () nepaisoma, todėl iškviečiama pagrindinės klasės versija.

Taigi mes priėjome šio straipsnio „Virtuali funkcija C ++“ pabaigą. Jei norite sužinoti daugiau, patikrinkite sukūrė patikima internetinė mokymosi įmonė „Edureka“. „Edureka“ „Java J2EE“ ir SOA mokymo ir sertifikavimo kursai yra skirti mokyti jus tiek pagrindinėms, tiek pažangesnėms „Java“ koncepcijoms kartu su įvairiomis „Java“ sistemomis, tokiomis kaip „Hibernate & Spring“.

Turite mums klausimą? Prašau tai paminėti šio tinklaraščio komentarų skiltyje ir mes kuo greičiau susisieksime su jumis.