Skirtumas tarp funkcijų perkrovos ir viršesnės C ++

Autorius: Laura McKinney
Kūrybos Data: 1 Balandis 2021
Atnaujinimo Data: 9 Gegužė 2024
Anonim
Type Punning in C++
Video.: Type Punning in C++

Turinys


perkrovos„Mes iš naujo apibrėžiame perkrautas funkcijas tuo pačiu funkcijų pavadinimu, tačiau skirtingais parametrų skaičiais ir tipais. „viršesnis„Nepaisomos funkcijos prototipas yra tas pats visoje programoje, tačiau prieš pradedant funkciją, kurios pagrindinėje klasėje yra raktinis žodis„ virtualus “, ją iš naujo nustato išvestinė klasė be jokio raktinio žodžio.

Polimorfizmas yra vienas iš esminių OOP požymių. Tai tiesiog reiškia „vieno vardo naudojimas kelioms formoms“. Polimorfizmą galima įgyvendinti naudojant „funkcijos perkrovą“, „operatoriaus perkrovą“ ir „virtualią funkciją“. Tiek „perkrovimas“, tiek „nepaisymas“ suponuoja polimorfizmo sąvoką. Čia „perkrovimas“ sudaro laiko polimorfizmą, o „nepaisymas“ yra laiko polimorfizmas. Studijuokime toliau, jei kalbėsime apie pagrindinius „perkrovos“ ir „nepaisymo“ skirtumus.

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

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


Palyginimo diagrama:

Palyginimo pagrindasPerkrovosNeprivaloma
PrototipasPrototipas skiriasi, nes parametrų skaičius ar tipas gali skirtis.Visi prototipo aspektai turi būti vienodi.
RaktažodžiaiPerkrovimo metu raktinis žodis netaikomas.Prieš funkciją, kuri turi būti panaikinta, pagrindinėje klasėje yra raktinis žodis virtualus.
Skiriamasis faktoriusSkiriasi parametrų skaičius ar tipas, nuo kurio priklauso funkcijos versija.Kurių klasių funkciją rodyklė šaukia, lemia, kurių klasių objektas priskiriamas tam žymekliui.
Apibūdinantis modelisFunkcija yra iš naujo apibrėžta tuo pačiu pavadinimu, tačiau skiriasi parametro numeris ir tipas.Funkcija yra apibrėžta, prieš ją pateikiant raktinį žodį pagrindinėje klasėje ir iš naujo apibrėžiant išvestinę klasę be raktinio žodžio.
Atlikimo laikasSudarykite laiką.Bėgimo laikas.
Konstruktoriaus / virtualioji funkcijaKonstruktoriai gali būti perkrauti.Virtualioji funkcija gali būti panaikinta.
Naikintojas
Naikintojas negali būti perkrautas.Sunaikintojas gali būti nuvertintas.
ĮrišimasDėl perkrovos ankstyvas įrišimas.Viršijimas reiškia vėlyvą įpareigojimą.


Apkrovos apibrėžimas

Kompiliacijos laiko polimorfizmas yra vadinamas „perkrovimu“. Kadangi perkrovos atsiranda iš polimorfizmo sąvokos, jis suteikia „bendrą kelių metodų sąsają“. Tai reiškia, kad jei funkcija yra perkrauta, joje yra tas pats funkcijos pavadinimas, kol ji yra naujai apibrėžta.

Perkrautos funkcijos skiriasi, skiriasi „parametrų (-ių) skaičius ar tipas“, todėl viena perkrauta funkcija skiriasi nuo kitos. Tokiu būdu kompiliatorius atpažįsta, kuri funkcija yra perkrauta. Dažniausiai perkrautos funkcijos yra „konstruktoriai“. „Kopijuoti konstruktorių“ yra savotiška „konstruktoriaus perkrova“.

Perkrovos įgyvendinimas C ++

klasės perkrova {int a, b; viešas: int load (int x) {// first load () function a = x; grąžinti a; } int apkrova (int x, int y) {// antra apkrova () funkcija a = x; b = y; grąžinti a * b; }}; int main () {perkrova O1; O1.krauti (20); // pirmosios pakrovimo () funkcijos iškvietimas O1.load (20,40); // antrojo įkėlimo () funkcijos skambutis}

Čia perkrauta klasės perkrovos funkcija (). Dvi klasės perkrautos funkcijos gali būti atskirtos taip, kad pirmoji apkrovos () funkcija priima tik vieną sveikojo skaičiaus parametrą, o antroji apkrovos () funkcija priima du sveikojo skaičiaus parametrus. Kai klasės objektas perkrauna vienintelio parametro funkciją „load ()“, iškviečiama pirmoji „load“ () funkcija. Kai objektas iškviečia „load ()“ funkciją, perduodant du parametrus, iškviečiama antroji „load“ () funkcija.


Nepaisymo apibrėžimas

Bėgimo metu pasiektas polimorfizmas yra vadinamas „viršesniu“. Tai atliekama naudojant „paveldėjimą“ ir „virtualias funkcijas“. Prieš funkciją, kuri turi būti panaikinta, pagrindinėje klasėje yra raktinis žodis „virtualus“, o iš naujo apibrėžtoje klasėje - be jokio raktinio žodžio.

Vienas iš svarbiausių dalykų, kuriuos reikia atsiminti nepaisymo atveju, yra tas, kad užleistos funkcijos prototipas neturi keistis, o išvestinė klasė jį iš naujo nustato. Kai yra iškviečiama nepagrįsta funkcija, C ++ nustato, kokia funkcijos versija vadinama remiantis „objekto, kurį nurodo rodyklė, veidu, kuriuo atliekama funkcijos kvietimas“.

Nepaisymo įgyvendinimas C ++

klasės bazė {public: virtual void funct () {// bazinės klasės cout virtuali funkcija << "Tai bazinių klasių funct ()"; }}; klasės išvestinė1: viešoji bazė {viešoji: negaliojanti funkcija () {// bazinės klasės virtualioji funkcija, apibrėžta išvestinėje1 klasės klasėje << "Tai yra išvestinė1 klasės funkcija ()"; }}; klasės deri2: viešoji bazė {public: void funct () {// bazinės klasės virtualioji funkcija, apibrėžta išvestinių2 klasėje. << "Tai yra deri2 klasių funkcija ()"; }}; int main () {bazė * p, b; išvestas1 d1; išvestas2 d2; * p = & b; p-> funktas (); // skambutis į bazinės klasės funkciją (). * p = & d1; p-> funktas (); // skambutis į deri1 klasės funkciją (). * p = & d2; p-> funktas (); // skambutis į deri2 klasės funkciją (). grįžti 0; }

Čia yra viena pagrindinė klasė, kurią viešai paveldi dvi išvestinės klasės. Virtualioji funkcija yra apibrėžta pagrindinėje klasėje su raktiniu žodžiu „virtualus“, ir ją iš naujo nustato abi išvestinės klasės be raktinio žodžio. Pagrindinėje () bazinėje klasėje sukuriamas žymiklio kintamasis „p“ ir objektas „b“; Klasė „išvestinė1“ sukuria objektą d1, o išvestinė2 klasė sukuria objektą d2 “.

Dabar iš pradžių bazinės klasės objekto „b“ adresas yra priskiriamas pagrindinės klasės „p“ rodyklei. „P“ iškviečia funkcijos funkciją (), todėl vadinama bazinės klasės funkcija.Tada išvestinės1 klasės objekto „d1“ adresas yra priskiriamas žymekliui „p“, vėl jis iškviečia funkciją (); čia vykdoma išvestinės1 klasės funkcija funct (). Galiausiai žymeklis „p“ priskiriamas „deri2“ klasės objektui. Tada „p“ skambina funkcijos funct (), kuris vykdo išvestinės 2 klasės funkcijos funct ().

Jei išvestinė1 / išvestinė2 klasė nebūtų iš naujo apibrėžusi funkcijos (), tada pagrindinės klasės funkcija () būtų vadinama, nes virtualioji funkcija yra „hierarchinė“.

  1. Perkraunamos funkcijos prototipas skiriasi dėl parametrų, perduotų perkrautai funkcijai, tipo ir skaičiaus. Kita vertus, perleistos funkcijos prototipas nesikeičia, nes pakeista funkcija atlieka skirtingus veiksmus skirtingai klasei, kuriai ji priklauso, tačiau su tuo pačiu parametro tipu ir skaičiumi.
  2. Perkeltos funkcijos pavadinime nėra nė vieno raktinio žodžio, tuo tarpu perleistos funkcijos pavadinimas pateikiamas tik su raktu „Virtual“ pagrindinėje klasėje.
  3. Kuri perkraunama funkcija priklauso nuo funkcijos parametro tipo ar skaičiaus. Nepaisoma funkcija, kuriai klasei taikoma, priklauso nuo to, kuris klasės objekto adresas yra priskirtas žymekliui, kuris sukvietė šią funkciją.
  4. Kurią perkrautą funkciją reikia išspręsti kompiliavimo metu. Kuri nepaisoma funkcija turi būti išspręsta vykdymo metu.
  5. Konstruktoriai gali būti perkrauti, tačiau jų negalima aplenkti.
  6. Naikintojai negali būti perkrauti, tačiau jie gali būti nepaisomi.
  7. Perkrovos metu užtikrinamas ankstyvas įrišimas, o kompiliavimo metu išsprendžiama, kuri funkcija bus perkrauta. Nepaisydamas pasiekiamas pavėluotas įrišimas, nes veikimo metu bus išspręsta, kuri funkcija, kuriai bus pakeista funkcija.

Panašumai

  1. Abu jie taikomi klasės nario funkcijoms.
  2. Polimorfizmas yra pagrindinė jų abiejų samprata.
  3. Funkcijų pavadinimas išlieka tas pats, kai funkcijas perkrauname ir viršijame.

Išvada

Panašu, kad perkrovos ir nepaisymas yra, tačiau taip nėra. Funkcijos gali būti perkrautos, tačiau bet kuri klasė ateityje negali iš naujo apibrėžti perkrautos funkcijos. Virtualios funkcijos negalima perkrauti; juos galima tik nepaisyti.