
Lisäksi tutkimme eroa ylikuormituksen ja ylivallan välillä vertailukaavion avulla.
Vertailukaavio:
Vertailun perusteet | Ylikuormitus | ensisijainen |
---|---|---|
Prototyyppi | Prototyyppi eroaa, koska parametrien lukumäärä tai tyyppi voi vaihdella. | Kaikkien prototyyppien tulee olla samat. |
avainsana | Avainsanaa ei sovellettu ylikuormituksen aikana. | Ylimääräistä toimintoa edeltää avainsana ”virtuaalinen” perusluokassa. |
Erottelukyky | Parametrin numero tai tyyppi eroaa, mikä määrittää, että funktion versiota kutsutaan. | Minkä luokan funktio kutsutaan osoittimelle, sen määrittelee osoite, jonka luokan kohde on osoitettu kyseiselle osoittimelle. |
Kuvion määrittäminen | Toiminto määritellään uudelleen samalla nimellä, mutta eri parametrien lukumäärä ja tyyppi. | Toiminto on määritelty, ennen kuin avainsanalla on avainsana "virtuaalinen" ja määritellään uudelleen johdettu luokka ilman avainsanaa. |
Saavutuksen aika | Käännä aikaa. | Suoritusaika. |
Rakentaja / virtuaalitoiminto | Rakentajat voidaan ylikuormittaa. | Virtuaalitoiminto voidaan ohittaa. |
destructor | Destruktoria ei voi ylikuormittaa. | Hävittäjä voidaan ohittaa. |
sitova | Ylikuormitus saavuttaa varhaisen sitomisen. | Ylimääräinen viittaus viittaa myöhäiseen sitomiseen. |
Ylikuormituksen määritelmä
Käännösajan polymorfiaa kutsutaan "ylikuormitukseksi". Koska ylikuormitus syntyy polymorfismin käsitteestä, se tarjoaa "yhteisen rajapinnan useille menetelmille". Tämä tarkoittaa, että jos toiminto on ylikuormitettu, se sisältää saman funktion nimen, kun se määritellään uudelleen.
Ylikuormitetut toiminnot poikkeavat toisistaan "eri parametrien tai niiden lukumäärän" mukaan, jolloin ylikuormitettu toiminto erottuu toisesta. Tällä tavalla kääntäjä tunnistaa, mitä ylikuormitettua toimintoa kutsutaan. Yleisimmin ylikuormitetut toiminnot ovat "rakentajia". ”Kopiointi- rakentaja” on eräänlainen ”rakentajan ylikuormitus”.
Ylikuormituksen toteutus C ++: ssa
luokan ylikuormitus {int a, b; julkinen: int load (int x) {// ensimmäinen kuormitus () funktio a = x; palaa a; } int kuormitus (int x, int y) {// toinen kuormitus () funktio a = x; b = y; palauta a * b; }}; int main () {ylikuormitus O1; O1.load (20); // ensimmäisen kuorman () funktion puhelu O1.load (20, 40); // toisen kuorman () funktiopuhelu}
Tällöin luokan ylikuormituksen toimintokuorma () on ylikuormitettu. Luokan kaksi ylikuormitettua toimintoa voidaan erottaa siten, että ensimmäinen kuormitus () -toiminto hyväksyy vain yhden kokonaislukuparametrin, kun taas toinen kuormitus () -toiminto hyväksyy kaksi kokonaislukuparametriä. Kun luokan ylikuormituksen kohde kutsuu kuorman () toimintoa yhdellä parametrilla, ensimmäinen kuormitus () -toiminto kutsutaan. Kun objektikutsut kuormitus () -toiminnolla kulkee kaksi parametria, toinen kuormitus () -toiminto kutsutaan.
Määritelmä ohittamisesta
Kestoajan aikana saavutettua polymorfismia kutsutaan "ylivoimaiseksi". Se toteutetaan käyttämällä perintö- ja virtuaalitoimintoja. Ylimääräistä toimintoa edeltää avainsana "virtuaalinen" perusluokassa ja määritellään uudelleen johdetussa luokassa ilman avainsanaa.
Yksi tärkeimmistä asioista, joita on syytä muistaa, on se, että ohitetun toiminnon prototyyppi ei saa muuttua, kun johdettu luokka määrittelee sen uudelleen. Kun ohitettu toiminto annetaan puheluun, C ++ määrittää, mitä funktion versiota kutsutaan osoittimen osoittaman "tyypin mukaan", jolla funktion kutsuminen suoritetaan.
Ohjauksen toteutus C ++: ssa
class base {public: virtual void funct () {// virtuaalitoiminto perusluokkaan cout << "Tämä on perusluokan funktio (); }}; luokka johdettu1: public base {public: void funct () {// perusluokan virtuaalitoiminto, joka on määritelty uudelleen johdetussa 1 luokan coutissa << "Tämä on johdettu 1-luokan funktio ()"; }}; luokka johdettu2: julkinen pohja {public: void funct () {// perusluokan virtuaalitoiminto, joka on määritelty uudelleen johdetussa 2 luokassafunct (); // puhelu johdettuun 1 luokkafunktioon (). * P = & d2; P-> funct (); // puhelu johdettuun2 luokkafunktioon (). paluu 0; }
Tässä on yksi perusluokka, joka on yleisesti peritty kahdesta johdetusta luokasta. Virtuaalitoiminto määritellään perusluokassa avainsanalla "virtuaalinen", ja molemmat johdetut luokat määritellään uudelleen ilman avainsanaa. Main () -luokassa luodaan osoittimen muuttuja 'p' ja kohde 'b'; "johdettu1" luo objektin d1 ja johdettu 2 luo objektin d2 '.
Aluksi peruskategorian 'b' osoite osoitetaan perusluokan "p" osoittimelle. 'p' antaa puhelun funktiolle funct (), joten perusluokan toimintoa kutsutaan. Tällöin osoitetun '1-luokan objektin' d1 'osoite osoitetaan osoittimelle' p ', joka taas antaa puhelun toimimaan (); tässä suoritetaan johdetun1 luokan funktio (). Lopuksi osoitin 'p' on osoitettu johdetun2 luokan objektille. Sitten "p" kutsuu funktion funct (), joka suorittaa johdetun2 luokan funktion func ().
Jos johdettu1 / johdettu2-luokka ei määrittänyt uudelleen funktiota (), niin perusluokan funktio () olisi kutsuttu, koska virtuaalitoiminto on "hierarkkinen".
Ylikuormituksen ja ohittamisen väliset keskeiset erot
- Ylikuormitettavan funktion prototyyppi eroaa ylikuormitetulle funktiolle siirrettävän parametrin tyypistä ja lukumäärästä. Toisaalta ohitetun toiminnon prototyyppi ei muutu, koska ohitettu toiminto suorittaa eri toiminnot eri luokalle, mutta se on samaa tyyppiä ja lukumäärää.
- Ylikuormitetun funktion nimi ei edetä mihinkään avainsanaan, kun taas ohitetun toiminnon nimi edeltää näppäimistöä "Virtual" vain perusluokassa.
- Mikä ylikuormitettu toiminto käynnistetään riippuu funktiolle siirrettävän parametrin tyypistä tai määrästä. Ylimääräinen toiminto, jonka luokkaa kutsutaan, riippuu siitä, mikä luokan kohdeosoite osoitetaan osoittimelle, joka otti käyttöön toiminnon.
- Minkä ylikuormitetun toiminnon käyttö on ratkaistu kääntymisajan aikana. Minkä ylittävän toiminnon, jota haluat käyttää, ratkaistaan suorituksen aikana.
- Rakentajia voidaan ylikuormittaa, mutta niitä ei voi ohittaa.
- Hävittäjiä ei voi ylikuormittaa, mutta ne voidaan ohittaa.
- Ylikuormitus saavuttaa varhaisen sitoutumisen, jolloin ylikuormitettu toiminto käynnistetään, ja se ratkaistaan kääntämisen aikana. Ylimääräinen sitominen saavuttaa myöhäisen sitoutumisen, koska mikä ylitystoiminto käynnistyy, se ratkaistaan ajon aikana.
yhtäläisyyksiä
- Molempia sovelletaan luokan jäsentoimintoihin.
- Polymorfismi on molempien perusta.
- Toiminnon nimi pysyy samana, kun käytämme ylikuormitusta ja ohitamme toimintoja.
johtopäätös
Ylikuormitus ja ylivoimaisuus näyttävät samanlaisilta, mutta näin ei ole. Toiminnot voidaan ylikuormittaa, mutta jokainen luokka ei voi enää määrittää uudelleen ylikuormitettua toimintoa tulevaisuudessa. Virtuaalitoimintoa ei voi ylikuormittaa; ne voidaan ohittaa vain.