Rekomenduojama, 2024

Redaktoriaus Pasirinkimas

Skirtumas tarp funkcijos perkrovimo ir viršijimo C + +

Polimorfizmas yra vienas iš svarbiausių OOP bruožų. Tai paprasčiausiai reiškia „naudoti vieną pavadinimą daugeliui formų“. Polimorfizmą galima įgyvendinti naudojant „funkcijų perkrovą“, „operatoriaus perkrovą“ ir „virtualią funkciją“. Tiek „perkrova“, tiek „viršesnis“ reiškia polimorfizmo sampratą. Čia „perkrova“ yra kompiliavimo laiko polimorfizmas ir „viršesnis“ yra paleisties laiko polimorfizmas. Toliau studijuoti, jei kalbame apie esminį „perkrovos“ ir „svarbiausio“ skirtumą. „Perkrovime“ iš naujo apibrėžiame perkrovos funkcijas su tuo pačiu funkcijos pavadinimu, tačiau skiriasi parametrų skaičius ir tipas. „Peržengiančiame“ viršutinės funkcijos prototipas yra tas pats visoje programoje, tačiau prieš viršutinę funkciją prieš raktinį žodį „pagrindinė“ yra raktinis žodis „virtualus“ ir iš naujo apibrėžiamas išvestos klasės be jokio raktinio žodžio.

Be to, mes tiriame skirtumą tarp perkrovos ir svarbiausio palyginimo lentelės pagalba.


Palyginimo diagrama:

Palyginimo pagrindasPerkrovimasNepaisymas
PrototipasPrototipas skiriasi, nes parametrų skaičius ar tipas gali skirtis.Visi prototipo aspektai turi būti tokie patys.
Raktinis žodisPerkrovimo metu netaikomas raktinis žodis.Funkcija, kuri turi būti pakeista, prieš raktinį žodį „virtualus“, yra pagrindinėje klasėje.
Skiriamasis veiksnysParametrų skaičius arba tipas skiriasi, kuri nustato, kokia funkcija yra vadinama.Kuris klasės rodiklis yra vadinamas žymekliu, yra nustatomas pagal adresą, kurio klasės objektas priskiriamas tam žymikliui.
Rašto apibrėžimasFunkcija iš naujo apibrėžiama tuo pačiu pavadinimu, tačiau skiriasi parametro skaičius ir tipas.Funkcija yra apibrėžiama, prieš kurią įveda raktinį žodį „virtualus“ pagrindinėje klasėje ir iš naujo apibrėžiama pagal išvestinę klasę be raktinio žodžio.
Atlikimo laikasKompiliavimo laikas.Vykdymo laikas.
Konstruktorius / Virtuali funkcijaKonstruktoriai gali būti perkrauti.Virtuali funkcija gali būti panaikinta.
Destruktorius
Sunaikintojas negali būti perkrautas.Destruktorius gali būti panaikintas.
ĮrišimasPerkrovimas pasiekia ankstyvą įpareigojimą.Svarbiausi nurodymai susiję su vėlavimu.

Perkrovos apibrėžimas

Kompiliavimo laiko polimorfizmas vadinamas „perkrovimu“. Kadangi perkrova yra sukurta pagal polimorfizmo koncepciją, ji suteikia „bendrą sąsają daugeliui metodų“. Tai reiškia, kad jei funkcija yra perkrauta, ji turi tą patį funkcijos pavadinimą, kai jis yra iš naujo apibrėžtas.

Perkrovos funkcijos skiriasi atsižvelgiant į skirtingą „parametrų (-ų) skaičių arba tipą“, todėl viena perkrovimo funkcija skiriasi nuo kitos. Tokiu būdu kompiliatorius atpažįsta, kokia perkrauta funkcija. Dažniausiai perkrautos funkcijos yra „konstruktoriai“. „Kopijavimo konstruktorius“ yra „konstruktoriaus perkrovos“ rūšis.

Perkrovos įgyvendinimas C ++

 klasės perkrova {int a, b; viešas: int load (int x) {// pirmosios apkrovos () funkcija a = x; grąžinti a; } int apkrova (int x, int y) {// antroji apkrova () funkcija a = x; b = y; grąžinti a * b; }}; int main () {perkrovimas O1; O1.load (20); // pirmosios apkrovos () funkcijos skambutis O1.load (20, 40); // antrosios apkrovos () funkcijos skambutis} 

Čia perkrovos klasių perkrovos funkcijos apkrova (). Dvi klasės perkrovos funkcijos gali būti išskirtos taip, kad pirmoji apkrova () funkcija priima tik vieną sveikojo skaičiaus parametrą, o antroji apkrovos () funkcija - du sveikojo skaičiaus parametrą. Kai klasės perkrovos objektas įveda apkrovos () funkciją su vienu parametru, pirmosios apkrovos () funkcija vadinama. Kai objektas iškviečia apkrovos () funkciją, praeinančią du parametrus, iškviesta antroji apkrova ().

Apribojimo apibrėžimas

Vykdymo metu pasiektas polimorfizmas vadinamas „svarbiausiu“. Tai pasiekiama naudojant „paveldėjimo“ ir „virtualias funkcijas“. Prieš perduodamą funkciją pagrindinėje klasėje yra raktinis žodis „virtualus“ ir iš naujo apibrėžiamas išvestoje klasėje be jokio raktinio žodžio.

Vienas iš svarbiausių dalykų, kuriuos reikia prisiminti, yra svarbiausias dalykas, kad viršutinės funkcijos prototipas neturi keistis, o išvestinė klasė ją iš naujo apibrėžia. Kreipiantis į viršutinę funkciją, „C ++“ nustato, kuri funkcijos versija vadinama pagal „rodyklės nurodytą objekto tipą“, kuriuo atliekamas funkcijų skambinimas.

Nepaisymo įgyvendinimas C + +

 class base {public: virtual void funct () {// virtuali bazinės klasės cout funkcija << „Tai bazinės klasės funkcija ()“; }}; klasė išvestinė1: public base {public: void funct () {// virtuali bazinės klasės funkcija, iš naujo apibrėžta išvestoje 1 klasės cout'e << "Tai išvestinė 1 klasės funkcija ()"; }}; klasė išvestinė2: viešoji bazė {public: void funct () {// virtuali bazinės klasės funkcija, iš naujo apibrėžta išvestinės 2 klasės cout'e  funkcija (); // skambinti į gautą 1 klasės funkciją (). * p = & d2; p-> funct (); // skambinti išvestos 2 klasės funkcijoms (). grąža 0; } 

Čia yra viena bazinė klasė, kurią viešai paveldi dvi išvestinės klasės. Virtuali funkcija apibrėžiama bazinėje klasėje su raktiniu žodžiu „virtualus“, ir ji iš naujo apibrėžiama iš abiejų išvestinių klasių be raktinių žodžių. Pagrindinėje () bazinėje klasėje sukuriamas rodyklės kintamasis „p“ ir objektas „b“; „išvestinė1“ klasė sukuria objektą d1, o išvestinė 2 klasė sukuria objektą d2 '.

Iš pradžių bazinės klasės objekto „b“ adresas priskiriamas bazinės klasės „p“ žymeniui. „p“ skambina į funkciją funct (), todėl vadinama bazinės klasės funkcija. Tada išvestinio 1 klasės objekto „d1“ adresas priskiriamas žymekliui „p“, vėl suteikiamas skambutis funkcionuoti (); čia atliekama išvestinės1 klasės funkcijos funkcija. Galiausiai, rodyklė „p“ priskiriama 2 klasės objektui. Tada „p“ skambina funkcija funct (), kuri atlieka išvestos 2 klasės funkciją (funkciją).

Jei išvestinė 1 / išvestinė 2 klasė nebuvo iš naujo apibrėžta (), tuomet bazinės klasės funkcija () būtų vadinama, nes virtualioji funkcija yra „hierarchinė“.

Pagrindiniai perkrovos ir viršijimo skirtumai

  1. Perkrovos funkcijos prototipas skiriasi dėl perkrovos funkcijai perduodamo parametro tipo ir skaičiaus. Kita vertus, perrašytos funkcijos prototipas nesikeičia, nes peržengta funkcija atlieka skirtingus veiksmus skirtingoms klasėms, tačiau priklauso tokio paties tipo ir skaičiaus parametrams.
  2. Perkrautos funkcijos pavadinimas neprieštarauja jokiam raktiniam žodžiui, o viršutinės funkcijos pavadinimas yra prieš raktą „Virtual“ tik pagrindinėje klasėje.
  3. Kokia perkrovimo funkcija naudojama, priklauso nuo funkcijai perduoto parametro tipo ar skaičiaus. Pereinamoji funkcija, kurios klasė yra naudojama, priklauso nuo to, kuriam klasės objekto adresui priskiriamas rodiklis, kuris kreipėsi į šią funkciją.
  4. Kokia perkrovimo funkcija turi būti naudojama, išsprendžiama kompiliavimo metu. Kuri viršutinė funkcija, į kurią reikia kreiptis, išsprendžiama vykdymo metu.
  5. Konstruktoriai gali būti perkrauti, tačiau jų negalima peržengti.
  6. Sunaikintuvai negali būti perkrauti, tačiau jie gali būti panaikinti.
  7. Perkrovimas pasiekia ankstyvą privalomąjį ryšį, kai perkrauta funkcija bus išspręsta sudarymo metu. Nepaisymas pasiekia vėlyvą įpareigojimą, nes bus pašalinta perrašyta funkcija.

Panašumai

  1. Abi taikomos klasės narių funkcijoms.
  2. Polimorfizmas yra pagrindinė abiejų pusių koncepcija.
  3. Funkcijos pavadinimas išlieka toks pats, kai taikome perkrovimą ir viršijame funkcijas.

Išvada

Perkrovimas ir viršenybė atrodo panašūs, tačiau taip nėra. Funkcijos gali būti perkrautos, bet bet kuri klasė ateityje negali iš naujo apibrėžti perkrautos funkcijos. Virtuali funkcija negali būti perkrauta; jie gali būti panaikinti.

Top