Suositeltava, 2024

Toimituksen Valinta

Toimintojen ylikuormituksen ja ohituksen välinen ero C ++: ssa

Polymorfismi on yksi OOP: n keskeisistä piirteistä. Se tarkoittaa yksinkertaisesti "yhden nimen käyttämistä useille lomakkeille". Polymorfismi voidaan toteuttaa käyttämällä "funktion ylikuormittumista", "operaattorin ylikuormitusta" ja "virtuaalitoimintaa". Sekä "ylikuormitus" että "ylivoimainen" merkitsevät polymorfismin käsitettä. Tässä "ylikuormitus" on käännösajan polymorfismi ja "ylivoimainen" on ajoaikapolymorfismi. Opiskelu jatkuu, jos puhumme suuresta erosta "ylikuormituksessa" ja "ylipainossa". "Ylikuormituksessa" määritellään uudelleen ylikuormitetut toiminnot samalla funktionimellä, mutta eri parametrien lukumäärä ja tyyppi. Ylimääräisen funktion prototyypissä "ylivoimainen" on sama ohjelma kaikkialla ohjelmassa, mutta ohitettavan toiminnon edessä on avainsana "virtuaalinen" perusluokassa, ja johdettu luokka määrittelee sen uudelleen ilman avainsanaa.

Lisäksi tutkimme eroa ylikuormituksen ja ylivallan välillä vertailukaavion avulla.


Vertailukaavio:

Vertailun perusteetYlikuormitusensisijainen
PrototyyppiPrototyyppi eroaa, koska parametrien lukumäärä tai tyyppi voi vaihdella.Kaikkien prototyyppien tulee olla samat.
avainsanaAvainsanaa ei sovellettu ylikuormituksen aikana.Ylimääräistä toimintoa edeltää avainsana ”virtuaalinen” perusluokassa.
ErottelukykyParametrin 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äminenToiminto 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 aikaKäännä aikaa.Suoritusaika.
Rakentaja / virtuaalitoimintoRakentajat voidaan ylikuormittaa.Virtuaalitoiminto voidaan ohittaa.
destructor
Destruktoria ei voi ylikuormittaa.Hävittäjä voidaan ohittaa.
sitovaYlikuormitus 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 luokassa  funct (); // 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

  1. 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ää.
  2. Ylikuormitetun funktion nimi ei edetä mihinkään avainsanaan, kun taas ohitetun toiminnon nimi edeltää näppäimistöä "Virtual" vain perusluokassa.
  3. 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.
  4. Minkä ylikuormitetun toiminnon käyttö on ratkaistu kääntymisajan aikana. Minkä ylittävän toiminnon, jota haluat käyttää, ratkaistaan ​​suorituksen aikana.
  5. Rakentajia voidaan ylikuormittaa, mutta niitä ei voi ohittaa.
  6. Hävittäjiä ei voi ylikuormittaa, mutta ne voidaan ohittaa.
  7. 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ä

  1. Molempia sovelletaan luokan jäsentoimintoihin.
  2. Polymorfismi on molempien perusta.
  3. 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.

Top