Skirtumas tarp virtualios ir grynos virtualios funkcijos

Autorius: Laura McKinney
Kūrybos Data: 2 Balandis 2021
Atnaujinimo Data: 1 Gegužė 2024
Anonim
Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained
Video.: Relationship between Virtual Functions, Pure Virtual Functions and Abstract Classes in OOP explained

Turinys


Tiek virtualioji funkcija, tiek grynoji virtualioji funkcija yra vykdymo laiko polimorfizmo sąvokos. Pagrindinis skirtumas tarp „virtuali funkcija ' ir „Gryna virtuali funkcija“ yra tai, kad „virtualioji funkcija“ turi savo apibrėžimą bazinėje klasėje, o paveldimos išvestinės klasės ją iš naujo nustato. Gryna virtualioji funkcija neturi apibrėžimo pagrindinėje klasėje, ir visos paveldimos išvestinės klasės turi ją iš naujo apibrėžti.

Tačiau virtualioji funkcija taip pat vadinama dinaminiu išsiuntimu ir vykdymo laiko išsiuntimu, nes iškviečiama funkcija nurodoma vykdymo metu atsižvelgiant į naudojamo objekto tipą.

Polimorfizmą palaiko ir kalbos C ++, ir „Java“. „Java“ kalba vietoj „virtualios funkcijos“ vartojamas terminas „nepaisoma“, nes virtualioji funkcija yra C ++ terminas.

  1. Palyginimo diagrama
  2. Apibrėžimas
  3. Pagrindiniai skirtumai
  4. Išvada

Palyginimo diagrama

Palyginimo pagrindasVirtuali funkcijaGryna virtuali funkcija
PagrindinisPagrindinė klasė apibrėžia virtualią funkciją.Gryna virtuali funkcija pagrindinėje klasėje neturi apibrėžimo.
Deklaracijavirtualus funct_name (parametro sąrašas) {. . . . .};virtualus funct_name (parametro sąrašas) = ​​0;
Išvestinė klasėVisos išvestinės klasės gali nepaisyti virtualiosios bazinės klasės funkcijos.Visos išvestinės klasės turi nepaisyti bazinės klasės virtualiosios funkcijos.
Poveikis

Virtualios funkcijos yra hierarchinio pobūdžio; tai neturi įtakos kompiliacijai, jei kurios nors išvestinės klasės neperžengia virtualiosios bazinės klasės funkcijos.Jei visoms išvestoms klasėms nepaisoma virtualios bazinės klasės funkcijos, įvyks kompiliavimo klaida.
AnotacijaNėra koncepcijos.Jei klasėje yra bent viena gryna virtualioji funkcija, tada ji paskelbiama abstrakčia.


Virtualiosios funkcijos apibrėžimas

virtualioji funkcija yra bazinės klasės nario funkcija, ir ją iš naujo nustato išvestinės klasės, kurios paveldi bazinę klasę. Nebūtina, kad visos paveldimos išvestinės klasės turėtų iš naujo apibrėžti virtualiąją funkciją, ją apibrėžia tik tos išvestinės klasės, kurioms gali reikėti jos veikimo. Skelbiant funkciją bazinėje klasėje prieš raktinį žodį, sukuriama virtuali funkcija „Virtualus“.

Deklaracija:

klasės bazė {vieša: virtualus tipas funt_name (parametrų sąrašas) {. . . }};

Paveldėjusios išvestinės klasės gali iš naujo apibrėžti virtualią funkciją be jokio „virtualiojo“ raktinio žodžio. Išvestos klasės iš naujo nustato virtualiąją funkciją, kad įvykdytų užduotį. Kadangi virtualioji funkcija yra iš naujo apibrėžta išvestinėse klasėse, mes turime kelias tos pačios funkcijos formas. Dabar, kokia funkcijos versija vadinama, priklauso nuo to, koks objektas yra nurodytas, kad tą funkciją iškviestų.


Daugiapakopis palikimas

Paveldėjimo daugiapakopyje atveju, kai išvestinė klasė, paveldėjusi virtualią funkciją iš savo bazinės klasės, kai ji pati naudojama kaip pagrindinė klasė kitai išvestinei klasei, virtualioji funkcija vis tiek gali būti ignoruojama. Taigi, paveldint virtualią funkciją, paveldima ir jos virtualioji prigimtis.

Virtualios funkcijos taip pat yra hierarchinio pobūdžio, t. Y. Jei išvestinė klasė neperžengia / neperpasakoja virtualios funkcijos, paveldėtos iš bazinės klasės, ir kai išvestinės klasės objektas iškviečia tą virtualią funkciją, tada iškviečiama pagrindinės klasės apibrėžta virtuali funkcija.

Grynos virtualios funkcijos apibrėžimas

Kaip matyti iš aukščiau, jei išvestinė klasė nenusileidžia virtualiajai funkcijai, naudojama pagrindinės klasės apibrėžta virtualioji funkcija. O kas, jei pati pagrindinė klasė neapibrėžia virtualiosios funkcijos. Daug kartų bazinė klasė neturi virtualiosios funkcijos apibrėžimo, arba kartais norite, kad visos išvestinės klasės viršytų virtualiąją funkciją.

Kad būtų galima tvarkyti šias dvi situacijas, „C ++“ palaiko „Gryna virtuali funkcija“. „Gryna virtuali funkcija“ deklaruojama bazinėje klasėje, tačiau jos apibrėžimo bazinėje klasėje nėra. Gryna virtualioji funkcija deklaruojama taip.

virtualus tipas funct_name (parametro sąrašas) = ​​0;

Kai virtualiosios funkcijos pagrindinėje klasėje yra „grynos“, kiekviena išvesta klasė privalo privalomai nepaisyti grynos virtualiosios bazinės klasės funkcijos. Jei išvestinė klasė nepaisys grynos virtualiosios bazinės klasės funkcijos, tai sukels kompiliavimo klaidą.

Anotacija

Klasė, kurioje yra bent viena gryna funkcija, vadinama „abstrakčia klase“. Negalima sukurti jokių abstrakčių klasių objektų, tačiau galite sukurti nuorodas ir rodykles į abstrakčias klases. Abstrakčių klasių narius galima pasiekti per išvestinių klasių objektą, kuris paveldi abstrakčią pagrindinę klasę.

Klasė, kurią norite paskelbti abstrakčia, naudokite raktinį žodį 'Abstraktus' priešais 'klasė' raktinis žodis.

// pavyzdžiui, abstraktus klasės klasės pavadinimas {. . virtualus tipas funct_name (parametro sąrašas) = ​​0; . . };

  1. Virtualios funkcijos neabejotinai yra apibrėžtos pagrindinėje klasėje ir iš naujo apibrėžtos (nepaisoma) išvestinėje klasėje. Kita vertus, gryna virtualioji pagrindinės klasės funkcija nėra aiškiai apibrėžta
  2. Išvestinė klasė, jei reikia, iš naujo apibrėžia (nepaiso) virtualią funkciją, tuo tarpu grynos virtualios funkcijos atveju klasė turi neabejotinai apibrėžti gryną virtualią funkciją.
  3. Jei išvestinei klasei nepavyksta iš naujo apibrėžti (nepaisyti) virtualiosios funkcijos, ji gali naudoti bazinės klasės virtualiąją funkciją. Jei išvestinė klasė nepaiso grynos virtualiosios funkcijos, atvirkščiai, atsiranda kompiliavimo klaida.
  4. Bazinė klasė, kurioje yra virtualioji funkcija, gali būti pagreitinta, t. Y. Gali būti sukurtas jos objektas. Priešingai, bazinė klasė, kurioje yra gryna virtualioji funkcija, t. Y. Abstrakčioji klasė negali būti įgyvendinta, nes abstrakčioji klasė nėra visiškai apibrėžta.

Pastaba:
„Virtualios funkcijos“ ir „grynos virtualios funkcijos“ prototipas visoje programoje išlieka tas pats.

Išvada:

„Virtualios funkcijos“ ir „gryna virtualioji funkcija“ turi savo reikšmę, nes „virtualiose funkcijose“ visoms išvestinėms klasėms nereikia iš naujo apibrėžti virtualiosios funkcijos, o kur mes norime, kad visos išvestinės klasės turėtų iš naujo apibrėžti virtualią funkciją, gryną virtualią funkciją. funkcija geriausiai tinka ten.