Ero toiminnon ylikuormituksen ja ohittamisen välillä C ++: ssa

Kirjoittaja: Laura McKinney
Luomispäivä: 1 Huhtikuu 2021
Päivityspäivä: 12 Saattaa 2024
Anonim
Ero toiminnon ylikuormituksen ja ohittamisen välillä C ++: ssa - Tekniikka
Ero toiminnon ylikuormituksen ja ohittamisen välillä C ++: ssa - Tekniikka

Sisältö


Sisään 'ylikuormitus'Määrittelemme ylikuormitetut toiminnot uudelleen samalla funktionimellä, mutta eri lukumäärällä ja tyypillä parametreja. Sisään 'ensisijainen'Korvatun toiminnon prototyyppi on sama koko ohjelmassa, mutta ohitettua toimintoa edeltää avainsana' virtuaali 'perusluokassa, ja johdettu luokka määrittelee sen uudelleen ilman mitään avainsanaa.

Polymorfismi on yksi OOP: n tärkeimmistä piirteistä. Se tarkoittaa yksinkertaisesti 'yhden nimen käyttöä useissa lomakkeissa'. Polymorfismi voidaan toteuttaa käyttämällä 'toiminnon ylikuormitusta', 'operaattorin ylikuormitusta' ja 'virtuaalitoimintoa'. Sekä 'ylikuormitus' ja 'ohittaminen' viittaavat polymorfismin käsitteeseen. Tässä 'ylikuormitus' on käännös aikapolymorfismista ja 'ohittaminen' on juoksuajan polymorfismi. Opiskelemme edelleen, jos puhumme merkittävistä eroista 'ylikuormituksessa' ja 'ohittamisessa'.


Lisäksi tutkimme eroa ylikuormituksen ja ohituksen välillä vertailutaulun avulla.

  1. Vertailutaulukko
  2. Määritelmä
  3. Keskeiset erot
  4. yhtäläisyyksiä
  5. johtopäätös


Vertailutaulukko:

Vertailun perusteetYlikuormitusensisijainen
PrototyyppiPrototyyppi eroaa parametrien lukumäärästä tai tyypistä.Prototyypin kaikkien näkökohtien on oltava samat.
avainsanaMitään avainsanaa ei ole käytetty ylikuormituksen aikana.Ohitettavaa toimintoa edeltää avainsana virtuaalinen perusluokassa.
Erottava tekijäParametrien lukumäärä tai tyyppi eroaa, mikä määrittää toiminnon version kutsutaan.Minkä luokan funktiota osoitin kutsuu, määritetään sen perusteella, minkä luokan toiminto osoitetaan osoittimelle.
Kuvion määritteleminenToiminto määritetään uudelleen samalla nimellä, mutta parametrilla on eri numero ja tyyppi.Toiminto määritetään, sitä edeltää avainsana virtuaalinen pääluokassa ja määrittelee johdettu luokka uudelleen avainsanalla.
Suorituksen aikaKokoa aika.Ajoaika.
Rakentaja / virtuaalitoimintoRakentajat voivat olla ylikuormitetut.Virtuaalitoiminto voidaan ohittaa.
destructor
Tuhoajaa ei voi ylikuormittaa.Tuhoaja voidaan ohittaa.
sitovaYlikuormituksella saavutetaan varhainen sidonta.Ohittaminen viittaa myöhäiseen sitomiseen.


Määritelmä Ylikuormitus

Yhdistelmäajan polymorfismia kutsutaan 'ylikuormitukseksi'. Koska ylikuormitus syntyy polymorfismin käsitteestä, se tarjoaa "yhteisen käyttöliittymän useille menetelmille". Tämä tarkoittaa, että jos funktio on ylikuormitettu, se sisältää saman toiminnon nimen, kun se määritetään uudelleen.

Ylikuormitetut toiminnot eroavat toisistaan, parametrien lukumäärä tai tyyppi eroaa toisistaan, joten ylikuormitetut toiminnot eroavat toisistaan. Tällä tavalla kääntäjä tunnistaa, mitä ylikuormitettua toimintoa kutsutaan. Yleisimmin ylikuormitetut toiminnot ovat 'rakentajia'. 'Kopiorakentaja' on eräänlainen 'rakentajan ylikuormitus'.

Ylikuormituksen toteuttaminen C ++ -järjestelmässä

luokan ylikuormitus {int a, b; public: int load (int x) {// ensimmäinen lataus () -toiminto a = x; palauta a; } int-kuorma (int x, int y) {// toinen kuorma () -toiminto a = x; b = y; palauta a * b; }}; int main () {ylikuormitus O1; O1.load (20); // ensimmäinen lataus () -toimintokutsu O1.load (20,40); // toinen lataus () -toimintapuhelu}

Tässä luokan ylikuormituksen funktiokuorma () on ylikuormitettu. Luokan kaksi ylikuormitettua funktiota voidaan erottaa siten, että ensimmäinen load () -toiminto hyväksyy vain yhden kokonaisluvun parametrin, kun taas toinen load () -toiminto hyväksyy kaksi kokonaislukuparametria. Kun luokan ylikuormituksen kohde kutsuu load () -toimintoa yhdellä parametrilla, ensimmäinen load () -toiminto kutsutaan. Kun esine kutsuu load () -toimintoa, joka ohittaa kaksi parametria, toinen load () -toiminto kutsutaan.

Määritelmä ohittaminen

Ajon aikana saavutettua polymorfismia kutsutaan 'ohittamiseksi'. Se saadaan aikaan käyttämällä 'perintö' ja 'virtuaalitoiminnot'. Ohitettavaa toimintoa edeltää avainsana 'virtuaali' perusluokassa ja määritetään uudelleen johdetussa luokassa ilman mitään avainsanaa.

Yksi tärkeimmistä asioista, jotka muistetaan ohittamisen yhteydessä, on, että ohitetun toiminnon prototyyppi ei saa muuttua, kun johdettu luokka määrittelee sen uudelleen. Kun ohitetulle toiminnolle annetaan puhelu, C ++ määrittelee, mitä toimintoversiota kutsutaan sen osoittimen osoittaman objektityypin perusteella, jolla toiminto soitetaan.

Ohittamisen toteuttaminen C ++: ssa

luokan kansi {public: virtual void funct () {// kanta luokan cout virtuaalitoiminto << "Tämä on kanta luokan funct ()"; }}; luokan johdettu1: julkinen kanta {julkinen: void funct () {// kantaluokan virtuaalifunktio, joka on määritelty uudelleen johdettuun1 luokan cout << "Tämä on johdettu1 luokan funktio ()"; }}; luokan johdettu2: julkinen perusta {julkinen: void funct () {// perusluokan virtuaalifunktio, joka on määritelty uudelleen johdettujen2 luokan cout << "Tämä on johdettu2 luokan funktio ()"; }}; int main () {base * p, b; johdettu1 d1; johdettu2 d2; * P = & b; P-> funct (); // soita perusluokan funktiolle (). * P = & d1; P-> funct (); // soita deri1-luokan funktiolle (). * P = & d2; P-> funct (); // soita deri2-luokan funktiolle (). paluu 0; }

Tässä on yksi perusluokka, jonka julkisesti perivät kaksi johdettua luokkaa. Virtuaali funktio määritetään perusluokassa avainsanalla 'virtuaali', ja molemmat johdetut luokat määrittelevät sen uudelleen ilman avainsanaa. Pääasiassa (), perusluokka luo osoittimen muuttujan 'p' ja objektin 'b'; Luokka 'johdettu1' luo objektin d1 ja johdettu2 luokka luo objektin d2 '.

Nyt alun perin perusluokan kohteen b osoite osoitetaan alaluokan p osoittimelle. 'P' kutsuu funktio funktiota (), joten perusluokan funktiota kutsutaan.Sitten johdettu1 luokkaobjektin 'd1' osoite osoitetaan osoittimelle 'p', jälleen se kutsuu funktiota (); tässä suoritetaan johdetun1 luokan funktio funct (). Lopuksi osoitin 'p' määritetään johdettujen2 luokan objektiin. Sitten p kutsuu funktio funktiota (), joka suorittaa johdetun2 luokan funktiota funktiota ().

Jos johdettu1 / johdettu2 luokka ei määritellyt funktiota (), niin perusluokan funktiota () olisi kutsuttu, koska virtuaalitoiminto on 'hierarkkinen'.

  1. Ylikuormitettavan funktion prototyyppi eroaa ylikuormitetulle toiminnolle siirtyvien parametrien tyypin ja lukumäärän vuoksi. Toisaalta ohitetun toiminnon prototyyppi ei muutu, koska ohitettu toiminto suorittaa erilaisia ​​toimia eri luokalle, johon se kuuluu, mutta samalla tyypillä ja parametrien lukumäärällä.
  2. Ylikuormitetun funktion nimi ei edes sisällä yhtäkään avainsanaa, kun taas korvatun funktion nimi edeltää vain perusluokan näppäimistöä “Virtuaali”.
  3. Mihin ylikuormitettuun funktioon kutsutaan, riippuu toiminnolle siirretyn parametrin tyypistä tai lukumäärästä. Minkä luokan kutsutaan ylitetty toiminto riippuu siitä, minkä luokan kohdeosoite on osoitettu osoittimelle, joka käynnisti toiminnon.
  4. Mihin ylikuormitettuun toimintoon on ryhdyttävä, ratkaistaan ​​käännösajan kuluessa. Mikä ohitettu toiminto, joka on käynnistettävä, ratkaistaan ​​ajon aikana.
  5. Rakentajat voivat olla ylikuormitettuja, mutta niitä ei voida ohittaa.
  6. Tuhoajia ei voi ylikuormittaa, mutta ne voidaan ohittaa.
  7. Ylikuormituksella saavutetaan varhainen sidonta, jolloin ylikuormitettuun toimintoon päästään ratkaisun kääntämisaikana. Ohittaminen saavuttaa myöhäisen sidonnan, koska ohitettu toiminto ratkaistaan ​​ajon aikana.

yhtäläisyyksiä

  1. Molemmat soveltuvat luokan jäsentoimintoihin.
  2. Polymorfismi on molempien taustalla oleva peruskonsepti.
  3. Toiminnon nimi pysyy samana, kun käytämme ylikuormitusta ja ohittamista toimintoihin.

johtopäätös

Ylikuormitus ja ohittaminen näyttävät samanlaisilta, mutta näin ei ole. Toiminnot voidaan ylikuormittaa, mutta yksikään luokka ei voi tulevaisuudessa määritellä ylikuormitettua toimintoa edelleen. Virtuaalia toimintoa ei voi ylikuormittaa; ne voidaan vain ohittaa.