C ++ polümorfism näite abil

Lang L: none (table-of-contents):

Anonim

Mis on C ++ polümorfism?

C ++ - s põhjustab polümorfism liikme funktsiooni erinevaks käitumiseks vastavalt objektile, mis seda kutsub / kutsub. Polümorfism on kreeka sõna, mis tähendab, et sellel on palju vorme. See juhtub siis, kui teil on pärimise kaudu seotud klasside hierarhia.

Oletame näiteks, et meil on funktsioon makeSound (). Kui kass seda funktsiooni kutsub, tekitab see mjäu. Kui lehm kasutab sama funktsiooni, annab see moow heli.

Kuigi meil on üks funktsioon, käitub see erinevates oludes erinevalt. Funktsioonil on palju vorme; seega oleme saavutanud polümorfismi.

Selles C ++ õpetuses saate teada:

  • Mis on polümorfism?
  • Polümorfismi tüübid
  • Koostage ajapolümorfism
  • Funktsioon Ülekoormus
  • Operaatori ülekoormus
  • Käitusaja polümorfism
  • Funktsiooni ülimuslikkus
  • C ++ virtuaalne funktsioon
  • Kompileerimisaegne polümorfism Vs. Jooksuaegne polümorfism

Polümorfismi tüübid

C ++ toetab kahte tüüpi polümorfismi:

  • Kompileerimisaegne polümorfism ja
  • Käitusaja polümorfism.

Koostage ajapolümorfism

Käivitate ülekoormatud funktsioonid, sobitades argumentide arvu ja tüübi. Teave on koostamise ajal olemas. See tähendab, et C ++ kompilaator valib kompileerimise ajal õige funktsiooni.

Kompileerimisaegne polümorfism saavutatakse funktsiooni ülekoormamise ja operaatori ülekoormamise kaudu.

Funktsioon Ülekoormus

Funktsioonide ülekoormus tekib siis, kui meil on palju funktsioone, millel on sarnased nimed, kuid erinevad argumendid. Argumendid võivad erineda arvu või tüübi poolest.

Näide 1:

#include using 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;}

Väljund:

Siin on ekraanipilt koodist:

Koodi selgitus:

  1. Kaasake iostreami päisefail meie koodi. Saame selle funktsioone kasutada.
  2. Lisage meie koodile standardne nimeruum. Saame kasutada selle tunde ilma seda helistamata.
  3. Looge funktsioon nimega test, mis võtab täisarvuparameetri i. {Tähistab funktsioonikatse algust.
  4. Lause, mis tuleb täita, kui ülaltoodud funktsioonitesti käivitatakse / kutsutakse.
  5. Ülaltoodud funktsioonikatse keha lõpp.
  6. Looge funktsioon nimega test, mis võtab ujukparameetri f. {Tähistab funktsioonikatse algust.
  7. Lause, mis tuleb täita, kui ülaltoodud funktsioonitesti käivitatakse / kutsutakse.
  8. Ülaltoodud funktsioonikatse keha lõpp.
  9. Looge funktsioon nimega test, mis võtab märgi parameetri ch. {Tähistab funktsioonikatse algust.
  10. Lause, mis tuleb täita, kui ülaltoodud funktsioonitesti käivitatakse / kutsutakse.
  11. Ülaltoodud funktsioonikatse keha lõpp.
  12. Helistage funktsioonile main (). {Tähistab funktsiooni keha algust.
  13. Kutsuge funktsiooni test ja andke sellele argumenti väärtusena 5. See kutsub esile testfunktsiooni, mis aktsepteerib täisarvu argumenti, see tähendab esimese testfunktsiooni.
  14. Kutsuge funktsiooni test ja edastage sellele argumendi väärtuseks 5.5. See kutsub esile testfunktsiooni, mis aktsepteerib ujukargumendi ehk teise testfunktsiooni.
  15. Kutsuge funktsiooni test ja andke sellele argumendi väärtusena viis. See kutsub esile testfunktsiooni, mis aktsepteerib märgi argumendi, st kolmanda testfunktsiooni.
  16. Eduka käitamise korral peab programm tagastama väärtuse.
  17. Põhifunktsiooni () keha lõpp.

Meil on kolm sama nime, kuid erinevat tüüpi argumentidega funktsiooni. Oleme saavutanud polümorfismi.

Operaatori ülekoormus

Operatori ülekoormamisel määratleme C ++ operaatori jaoks uue tähenduse. See muudab ka operaatori tööd. Näiteks saame kahe stringi liitmiseks määratleda operaatori +. Teame seda kui arvväärtuste lisamise operaatorit. Pärast meie määratlust lisab see täisarvude vahele paigutades need. Nööride vahele asetatuna ühendab see neid.

Näide 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();}

Väljund:

Siin on ekraanipilt koodist:

Koodi selgitus:

  1. Kaasake iostreami päisefail meie programmi, et selle funktsioone kasutada.
  2. Kaasake standardne nimeruum meie programmi, et kasutada selle klasse ilma seda kutsumata.
  3. Looge klass nimega ComplexNum. {Tähistab klassikeha algust.
  4. Muutujate privaatseks märkimiseks kasutage privaatset juurdepääsu modifikaatorit, mis tähendab, et neile pääseb juurde ainult klassi sees.
  5. Määratlege kaks täisarvu muutujat, reaalne ja üle.
  6. Kasutage avaliku juurdepääsu modifikaatorit, et märkida konstruktor avalikuks, mis tähendab, et sellele pääseb juurde ka väljaspool klassi.
  7. Looge klassi konstruktor ja muutujate lähtestamine.
  8. Initsialiseerige muutuja reaalne väärtus.
  9. Initsialiseerige muutuja väärtus üle.
  10. Konstruktori kere ots.
  11. Peame tühistama operaatori + tähenduse.
  12. Looge tüübi ComplexNum andmetüübi tulemus.
  13. Kasutage kompleksarvudega operaatorit +. See rida lisab numbri reaalse osa teise numbri reaalseks osaks.
  14. Kasutage kompleksarvudega operaatorit +. See rida lisab arvu kujuteldava osa teise numbri kujuteldavale osale.
  15. Programm tagastab edukal täitmisel muutuja tulemuse väärtuse.
  16. + Operaatori uue tähenduse ehk ülekoormuse määratluse lõpp.
  17. Helistage meetodile print ().
  18. Pärast konsoolile lisamist printige uus kompleksnumber.
  19. Funktsiooni prindikeha () lõpp.
  20. ComplexNumi klassi kere ots.
  21. Helistage funktsioonile main ().
  22. Edastage lisatavate nii reaalsete kui ka keeruliste osade väärtused. C1 esimene osa lisatakse c2 esimesele osale, see tähendab 10 + 3. C1 teine ​​osa lisatakse c teisele osale, see tähendab 2 + 7.
  23. Tehke operatsioon ülekoormatud + operaatori abil ja salvestage tulemus muutujasse c3.
  24. Trükkige konsoolile muutuja c3 väärtus.
  25. Põhifunktsiooni () keha lõpp.

Käitusaja polümorfism

See juhtub siis, kui objekti meetodit kutsutakse / kutsutakse käitamise ajal, mitte kompileerimise ajal. Käitusaja polümorfism saavutatakse funktsiooni ületamise kaudu. Funktsioon, mida kutsutakse / kutsutakse, luuakse käituse ajal.

Funktsiooni ülimuslikkus

Funktsiooni tühistamine toimub siis, kui baasklassi funktsioonile antakse tuletatud klassis uus määratlus. Sel ajal võime öelda, et baasfunktsioon on alistatud.

Näiteks:

#include using 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;}

Väljund:

Siin on ekraanipilt koodist:

Koodi selgitus:

  1. Selle funktsioonide kasutamiseks importige iostreami päisefail meie programmi.
  2. Kaasake standardne nimeruum meie programmi, et kasutada selle klasse ilma seda kutsumata.
  3. Looge klass nimega Imetaja. {Tähistab klassikeha algust.
  4. Kasutage üldsuse juurdepääsu modifikaatorit, et seada funktsioon, mida me loome, avalikult juurdepääsetavaks. Sellele pääseb juurde väljaspool seda klassi.
  5. Looge avalik funktsioon nimega sööma. {Tähistab funktsioonikeha algust.
  6. Funktsiooni cout () käivitamisel lisage funktsioonile cout lisatud lause.
  7. Funktsioonikeha lõpp söö ().
  8. Imetaja klassi keha ots.
  9. Loo klass nimega Lehm, mis pärib Imetajate klassi. Lehm on tuletatud klass, samas kui imetaja on põhiklass. {Tähistab selle klassi algust.
  10. Kasutage avaliku juurdepääsu modifikaatorit funktsiooni, mida me loodame, märkimiseks avalikult juurdepääsetavaks. Sellele pääseb juurde väljaspool seda klassi.
  11. Alistage põhiklassis määratletud funktsioon eat (). {Tähistab funktsioonikeha algust.
  12. Avaldus, mida selle funktsiooni käivitamisel konsoolile printida.
  13. Funktsiooni keha lõpp söö ().
  14. Lehma klassi kere lõpp.
  15. Helistage funktsioonile main (). {Tähistab selle funktsiooni keha algust.
  16. Looge lehma klassi eksemplar ja andke talle nimi c.
  17. Helistage klassis Lehm määratletud funktsioonile eat ().
  18. Programm peab edukal lõpetamisel tagastama väärtuse.
  19. Põhifunktsiooni () lõpp.

C ++ virtuaalne funktsioon

Virtuaalne funktsioon on veel üks viis tööaja polümorfismi rakendamiseks C ++ -s. See on baasklassis määratletud ja tuletatud klassis uuesti määratletud erifunktsioon. Virtuaalse funktsiooni deklareerimiseks peaksite kasutama virtuaalset märksõna. Märksõna peaks eelnema funktsiooni deklareerimisele põhiklassis.

Kui virtuaalne funktsiooniklass on päritud, määratleb virtuaalklass virtuaalse funktsiooni oma vajadustele vastavalt. Näiteks:

#include using 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();}

Väljund:

Siin on ekraanipilt koodist:

Koodi selgitus:

  1. Selle funktsioonide kasutamiseks lisage koodi iostream päisefail.
  2. Kaasake standardnimeruum meie koodi, et kasutada selle klasse ilma seda kutsumata.
  3. Looge klass nimega ClassA.
  4. Kasutage üldkasutatava juurdepääsu modifikaatorit, et märkida klassi liige avalikult juurdepääsetavaks.
  5. Looge virtuaalne funktsioon nimega show (). Sellest saab avalik funktsioon.
  6. Väljaprinditava teksti () käivitamisel prinditav tekst. Endl on C ++ märksõna, mis tähendab lõppjoont. See viib hiirekursori järgmisele reale.
  7. Virtuaalfunktsiooni show () keha lõpp.
  8. A-klassi kere ots.
  9. Uue klassi nimega ClassB loomine, mis pärib klassi A. Klass A saab baasklassi, klass B aga tuletatud klassi.
  10. Kasutage üldkasutatava juurdepääsu modifikaatorit, et märkida klassi liige avalikult juurdepääsetavaks.
  11. Määratlege baasklassi tuletatud virtuaalne funktsioon show () uuesti.
  12. Konsoolile printimiseks vajalik tekst, kui tuletatud klassis määratletud funktsioon show () käivitatakse.
  13. Funktsiooni show () keha lõpp.
  14. Tuletatud klassi, B klassi keha lõpp.
  15. Helistage funktsioonile main (). Programmi loogika tuleks lisada selle kehasse.
  16. Looge kursori muutuja nimega a. See osutab klassile nimega A.
  17. Looge klassi eksemplar nimega ClassB. Eksemplarile antakse nimi b.
  18. Määrake muutuja a aadressi b väärtuste salvestused.
  19. Käivitage tuletatud klassis määratletud funktsioon show (). Hiline sidumine on rakendatud.
  20. Põhifunktsiooni () keha lõpp.

Kompileerimisaegne polümorfism Vs. Jooksuaegne polümorfism

Siin on nende kahe peamised erinevused:

Kompileerimisaegne polümorfism Käitusaja polümorfism
Seda nimetatakse ka varajaseks sidumiseks või staatiliseks polümorfismiks Seda nimetatakse ka hiliseks / dünaamiliseks sidumiseks või dünaamiliseks polümorfismiks
Meetodit kutsutakse / kutsutakse kompileerimise ajal Meetodit kutsutakse / kutsutakse käitamise ajal
Rakendatakse funktsiooni ülekoormamise ja operaatori ülekoormuse kaudu Rakendatud meetodi ülekaalukate ja virtuaalsete funktsioonide kaudu
Näide, meetodi ülekoormamine. Paljudel meetoditel võivad olla sarnased nimed, kuid erinev argumentide arv või tüüp Näide, meetodi ülimuslikkus. Paljudel meetoditel võib olla sarnane nimi ja sama prototüüp.
Kiirem käivitamine, kuna meetodite avastamine toimub kompileerimise ajal Aeglasem täitmine, kuna meetodi avastaja tehakse käituse ajal.
Pakutakse vähem paindlikkust probleemide lahendamiseks, kuna kompileerimise ajal on kõik teada. Keerukate probleemide lahendamiseks pakutakse palju paindlikkust, kuna meetodid avastatakse tööaja jooksul.

Kokkuvõte:

  • Polümorfism tähendab mitmel kujul esinemist.
  • See tekib siis, kui on olemas pärimise kaudu seotud klasside hierarhia.
  • Polümorfismi korral võib funktsioon käituda teisiti, lähtudes objektist, mis seda kutsub / kutsub.
  • Kompileerimisaja polümorfismis luuakse kompileerimise ajal funktsioon, millele tugineda.
  • Käitusaja polümorfismis luuakse käivitatav funktsioon käivitamise ajal.
  • Kompileerimisaja polümorfism määratakse funktsiooni ülekoormuse ja operaatori ülekoormuse abil.
  • Funktsioonide ülekoormamisel on palju funktsioone, millel on sarnased nimed, kuid erinevad argumendid.
  • Parameetrid võivad erineda arvu või tüübi järgi.
  • Operaatori ülekoormamisel on C ++ operaatorite jaoks määratletud uus tähendus.
  • Käitusaja polümorfism saavutatakse funktsiooni ületamise kaudu.
  • Funktsiooni ülekandmisel annab tuletatud klass baasklassis määratletud funktsioonile uue definitsiooni.