Mikä on polymorfismi C ++: ssa?
C ++: ssa polymorfismi saa jäsenfunktion käyttäytymään eri tavalla sen kutsuvan / kutsuvan objektin perusteella. Polymorfismi on kreikkalainen sana, joka tarkoittaa, että sillä on monia muotoja. Se tapahtuu, kun sinulla on perintöihin liittyvien luokkien hierarkia.
Oletetaan esimerkiksi, että meillä on funktio makeSound (). Kun kissa kutsuu tätä toimintoa, se tuottaa meow-äänen. Kun lehmä käyttää samaa toimintoa, se antaa moow-äänen.
Vaikka meillä on yksi tehtävä, se käyttäytyy eri tavoin eri olosuhteissa. Funktiolla on monia muotoja; siten olemme saavuttaneet polymorfismin.
Tässä C ++ -opetusohjelmassa opit:
- Mikä on polymorfismi?
- Polymorfismin tyypit
- Koosta aikapolymorfismi
- Toiminto Ylikuormitus
- Kuljettajan ylikuormitus
- Suorituksen polymorfismi
- Toiminnon ohittaminen
- C ++ - virtuaalitoiminto
- Compile-Time Polymorphism vs. Run-Time-polymorfismi
Polymorfismin tyypit
C ++ tukee kahta polymorfismin tyyppiä:
- Kokoamisajan polymorfismi ja
- Ajonaikainen polymorfismi.
Koosta aikapolymorfismi
Käynnistät ylikuormitetut toiminnot sovittamalla yhteen argumenttien lukumäärän ja tyypin. Tiedot ovat läsnä kokoamisajan aikana. Tämä tarkoittaa, että C ++-kääntäjä valitsee oikean toiminnon kääntöhetkellä.
Kääntöaikapolymorfismi saavutetaan toiminnan ylikuormituksella ja käyttäjän ylikuormituksella.
Toiminto Ylikuormitus
Funktioiden ylikuormitus tapahtuu, kun meillä on monia toimintoja, joilla on samanlaiset nimet, mutta erilaiset argumentit. Argumentit voivat vaihdella lukumäärän tai tyypin suhteen.
Esimerkki 1:
#includeusing namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}
Tuotos:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto koodiimme. Pystymme käyttämään sen toimintoja.
- Sisällytä vakio nimitila koodissamme. Voimme käyttää sen luokkia kutsumatta sitä.
- Luo funktio nimeltä testi, joka ottaa kokonaislukuparametrin i. {Merkitsee toimintatestin alkua.
- Lausunto suoritettava, jos yllä olevaa toimintatestiä kutsutaan / kutsutaan.
- Edellä olevan toimintatestin rungon pää.
- Luo funktio nimeltä testi, joka vie kelluvan parametrin f. {Merkitsee toimintatestin alkua.
- Lausunto suoritettava, jos yllä olevaa toimintatestiä kutsutaan / kutsutaan.
- Edellä olevan toimintatestin rungon pää.
- Luo funktio nimeltä testi, joka ottaa merkkiparametrin ch {Merkitsee toimintatestin alkua.
- Lausunto suoritettava, jos yllä olevaa toimintatestiä kutsutaan / kutsutaan.
- Edellä olevan toimintatestin rungon pää.
- Kutsu main () -toiminto. {Merkitsee funktion rungon alkua.
- Kutsu funktiotesti ja välitä se 5 argumentin arvoksi. Tämä kutsuu testifunktion, joka hyväksyy kokonaisluvun argumentin, eli ensimmäisen testifunktion.
- Kutsu funktiotesti ja välitä se 5.5 argumentin arvoksi. Tämä käynnistää testifunktion, joka hyväksyy float-argumentin, toisin sanoen toisen testifunktion.
- Kutsu funktiotesti ja välitä sille viisi argumentin arvoksi. Tämä käynnistää testifunktion, joka hyväksyy merkkiargumentin, eli kolmannen testifunktion.
- Ohjelman on palautettava arvo, jos se toimii onnistuneesti.
- Pääfunktion () rungon pää.
Meillä on kolme toimintoa, joilla on sama nimi, mutta erityyppiset argumentit. Olemme saavuttaneet polymorfismin.
Kuljettajan ylikuormitus
Kohdassa Operaattorin ylikuormitus määritämme uuden merkityksen C ++ -operaattorille. Se muuttaa myös käyttäjän toimintaa. Esimerkiksi voimme määritellä + -operaattorin liittämään kaksi merkkijonoa. Tunnemme sen lisäysoperaattorina numeeristen arvojen lisäämiseen. Määritelmän jälkeen, kun se sijoitetaan kokonaislukujen väliin, se lisää ne. Kun se asetetaan merkkijonojen väliin, se ketjuttaa ne.
Esimerkki 2:
#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}
Tuotos:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto ohjelmaamme käyttääksesi sen toimintoja.
- Sisällytä vakio nimitila ohjelmaamme, jotta voit käyttää sen luokkia kutsumatta sitä.
- Luo luokka nimeltä ComplexNum. {Tarkoittaa luokkaosan alkua.
- Merkitse muuttujat yksityisiksi yksityisen käyttöoikeuden modifikaattorilla, mikä tarkoittaa, että niihin pääsee vain luokan sisällä.
- Määritä kaksi kokonaislukumuuttujaa, reaali ja yli.
- Käytä julkisen käytön modifikaattoria merkitäksesi rakentajan julkiseksi, mikä tarkoittaa, että siihen pääsee käsiksi myös luokan ulkopuolelta.
- Luo luokan rakentaja ja alusta muuttujat.
- Alusta reaalimuuttujan arvo.
- Alusta muuttujan arvo.
- Rakentajan rungon pää.
- Meidän on ohitettava + -operaattorin merkitys.
- Luo tietotyypin tulos ComplexNum.
- Käytä + -operaattoria kompleksilukuilla. Tämä rivi lisää luvun todellisen osan toisen luvun oikeaan osaan.
- Käytä + -operaattoria kompleksilukuilla. Tämä rivi lisää luvun kuvitteellisen osan toisen luvun kuvitteelliseen osaan.
- Ohjelma palauttaa muuttujan tuloksen arvon onnistuneen suorituksen jälkeen.
- + -Operaattorin uuden merkityksen eli ylikuormituksen määritelmän loppu.
- Kutsu tulostusmenetelmä ().
- Tulosta uusi kompleksinumero numeron lisäämisen jälkeen konsoliin.
- Tulostusteksti () -toiminnon loppu.
- ComplexNum-luokan rungon pää.
- Kutsu main () -toiminto.
- Välitä sekä todellisten että monimutkaisten osien arvot lisättäväksi. C1: n ensimmäinen osa lisätään c2: n ensimmäiseen osaan, ts. 10 + 3. C1: n toinen osa lisätään c: n toiseen osaan, toisin sanoen 2 + 7.
- Suorita toimenpide ylikuormitetulla + -operaattorilla ja tallenna tulos muuttujaan c3.
- Tulosta muuttujan c3 arvo konsolille.
- Päätoiminnon () rungon loppu.
Suorituksen polymorfismi
Tämä tapahtuu, kun objektin menetelmää kutsutaan / kutsutaan suorituksen aikana eikä kääntöajan aikana. Ajonaikainen polymorfismi saavutetaan toiminnan ohittamisen avulla. Kutsu- ja kutsuttava toiminto määritetään ajon aikana.
Toiminnon ohittaminen
Funktioiden ohittaminen tapahtuu, kun perusluokan funktiolle annetaan uusi määritelmä johdetussa luokassa. Tuolloin voimme sanoa, että perustoiminto on ohitettu.
Esimerkiksi:
#includeusing namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}
Tuotos:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Tuo iostream-otsikkotiedosto ohjelmaamme käyttääksesi sen toimintoja.
- Sisällytä vakio nimitila ohjelmaamme, jotta voit käyttää sen luokkia kutsumatta sitä.
- Luo luokka nimeltä Nisäkäs. {Tarkoittaa luokkaosan alkua.
- Aseta julkisen pääsyn modifikaattorilla toiminto, jonka aiomme luoda julkisesti saatavana. Siihen pääsee tämän luokan ulkopuolelta.
- Luo julkinen toiminto nimeltä syö. {Merkitsee funktion rungon alkua.
- Tulosta lause, joka on lisätty cout-toimintoon, kun toiminto syö () kutsutaan.
- Toimintakehon loppu syö ().
- Nisäkkään luokan rungon pää.
- Luo luokka nimeltä Lehmä, joka perii nisäkäsluokan. Lehmä on johdettu luokka, kun taas nisäkäs on perusluokka. {Merkitsee tämän luokan alkua.
- Merkitse julkisen käyttöoikeuden muokkaimella toiminto, jonka aiomme luoda, julkisesti saatavana olevaksi. Siihen pääsee tämän luokan ulkopuolelta.
- Ohita funktio syö (), joka määritettiin perusluokassa. {Merkitsee funktion rungon alkua.
- Lauseke, joka tulostetaan konsolille, kun tätä toimintoa käytetään.
- Rungon loppu syödä ().
- Lehmän luokan rungon pää.
- Kutsu main () -toiminto. {Tarkoittaa tämän toiminnon rungon alkua.
- Luo lehmä-luokan esiintymä ja antamalla sille nimi c.
- Kutsu lehmäluokassa määritetty syö () -funktio.
- Ohjelman on palautettava arvo, kun se on suoritettu onnistuneesti.
- Päätoiminnon () loppu.
C ++ - virtuaalitoiminto
Virtuaalifunktio on toinen tapa toteuttaa ajoaikapolymorfismi C ++: ssa. Se on erityinen funktio, joka on määritelty perusluokassa ja määritelty uudelleen johdetussa luokassa. Virtuaalitoiminnon ilmoittamiseksi sinun tulee käyttää virtuaalista avainsanaa. Avainsanan tulisi edeltää funktion ilmoitusta perusluokassa.
Jos virtuaalifunktioluokka peritään, virtuaaliluokka määrittelee virtuaalifunktion uudelleen sen tarpeiden mukaan. Esimerkiksi:
#includeusing namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}
Tuotos:
Tässä on kuvakaappaus koodista:
Koodin selitys:
- Sisällytä iostream-otsikkotiedosto koodiin käyttääksesi sen toimintoja.
- Sisällytä vakio nimitila koodissamme käyttääksesi luokkia sitä kutsumatta.
- Luo luokka nimeltä ClassA.
- Merkitse luokan jäsen julkisesti saatavana muokkausohjelmalla.
- Luo näennäisfunktio nimeltä show (). Se on julkinen tehtävä.
- Tulostettava teksti, kun show () kutsutaan, käynnistetään. Endl on C ++ -avainsana, mikä tarkoittaa loppuriviä. Se siirtää hiiren kohdistimen seuraavalle riville.
- Virtuaalitoiminnon show () rungon loppu.
- Luokan A rungon pää.
- Luodaan uusi luokka nimeltä ClassB, joka perii luokan A. Luokasta A tulee perusluokka, kun taas luokasta B tulee johdettu luokka.
- Merkitse luokan jäsen julkisesti saatavana muokkausohjelmalla.
- Määritä uudelleen perusluokasta johdettu virtuaalinen funktioshow ().
- Konsolille tulostettava teksti käytettäessä johdetussa luokassa määritettyä show () -funktiota.
- Show () -funktion rungon loppu.
- Johdetun luokan rungon pää, luokka B.
- Kutsu main () -toiminto. Ohjelmalogiikka tulisi lisätä sen runkoon.
- Luo osoitinmuuttuja nimeltä a. Se osoittaa luokan A nimistä luokkaa.
- Luo luokan ilmentymä nimeltä ClassB. Ilmentymälle annetaan nimi b.
- Määritä arvovarastot muuttujan a osoitteeseen b.
- Käynnistä johdetussa luokassa määritetty show () -funktio. Myöhäinen sitoutuminen on toteutettu.
- Pääfunktion () rungon pää.
Compile-Time Polymorphism vs. Run-Time-polymorfismi
Tässä on suurimmat erot näiden kahden välillä:
Kokoamisajan polymorfismi | Run-time-polymorfismi |
Sitä kutsutaan myös varhaiseksi sitoutumiseksi tai staattiseksi polymorfismiksi | Sitä kutsutaan myös myöhäiseksi / dynaamiseksi sitoutumiseksi tai dynaamiseksi polymorfismiksi |
Menetelmää kutsutaan / kutsutaan kääntöajan aikana | Menetelmää kutsutaan / kutsutaan ajon aikana |
Toteutetaan toimintojen ylikuormituksen ja käyttäjän ylikuormituksen avulla | Toteutetaan menetelmän ohittavien ja virtuaalisten toimintojen kautta |
Esimerkki menetelmän ylikuormituksesta. Monilla menetelmillä voi olla samankaltaiset nimet, mutta erilaiset argumentit tai tyypit | Esimerkki, menetelmä ohittaa. Monilla menetelmillä voi olla samanlainen nimi ja sama prototyyppi. |
Nopeampi toteutus, koska menetelmien löytäminen tapahtuu kääntöajan aikana | Hitaampi toteutus, koska menetelmän löytö tehdään ajon aikana. |
Vähemmän joustavuutta ongelmanratkaisussa tarjotaan, koska kaikki tiedetään kääntöajan aikana. | Paljon joustavuutta tarjotaan monimutkaisten ongelmien ratkaisemiseen, koska menetelmät löydetään ajon aikana. |
Yhteenveto:
- Polymorfismi tarkoittaa, että sillä on monia muotoja.
- Se tapahtuu, kun perintö liittyy luokkahierarkiaan.
- Polymorfismin avulla funktio voi käyttäytyä eri tavalla sen perusteella, mikä objekti sitä kutsuu / kutsuu.
- Kääntöaikapolymorfismissa kutsuttava toiminto vahvistetaan kääntöajan aikana.
- Ajonaikaisessa polymorfismissa toiminto, johon kutsutaan, määritetään ajon aikana.
- Kokoamisajan polymorfismi määritetään toiminnan ylikuormituksen ja käyttäjän ylikuormituksen avulla.
- Funktioiden ylikuormituksessa on monia toimintoja, joilla on samanlaiset nimet, mutta erilaiset argumentit.
- Parametrit voivat vaihdella lukumäärän tai tyypin mukaan.
- Operaattorin ylikuormituksessa määritetään uusi merkitys C ++ -operaattoreille.
- Ajonaikainen polymorfismi saavutetaan toiminnan ohittamisen avulla.
- Funktion ohituksessa johdettu luokka antaa uuden määritelmän perusluokassa määritetylle funktiolle.