C ++ polimorfisms ar piemēru

Satura rādītājs:

Anonim

Kas ir polimorfisms C ++?

Programmā C ++ polimorfisms liek dalībnieka funkcijai uzvesties atšķirīgi, pamatojoties uz objektu, kas to izsauc / izsauc. Polimorfisms ir grieķu vārds, kas nozīmē, ka tam ir daudz formu. Tas notiek, kad jums ir mantojuma dēļ saistītu klašu hierarhija.

Piemēram, pieņemsim, ka mums ir funkcija makeSound (). Kad kaķis izsauks šo funkciju, tas radīs meow skaņu. Kad govs izsauc to pašu funkciju, tā nodrošinās moow skaņu.

Lai gan mums ir viena funkcija, dažādos apstākļos tā rīkojas atšķirīgi. Funkcijai ir dažādas formas; līdz ar to mēs esam sasnieguši polimorfismu.

Šajā C ++ apmācībā jūs uzzināsiet:

  • Kas ir polimorfisms?
  • Polimorfisma veidi
  • Apkopot laika polimorfismu
  • Funkcija Pārslodze
  • Operatora pārslodze
  • Izpildlaika polimorfisms
  • Funkcijas ignorēšana
  • C ++ virtuālā funkcija
  • Sastādīšanas laika polimorfisms Vs. Ekspluatācijas laika polimorfisms

Polimorfisma veidi

C ++ atbalsta divu veidu polimorfismu:

  • Kompilācijas laika polimorfisms un
  • Runtime polimorfisms.

Apkopot laika polimorfismu

Jūs izsaucat pārslogotās funkcijas, saskaņojot argumentu skaitu un veidu. Informācija ir apkopošanas laikā. Tas nozīmē, ka kompilators C ++ kompilēšanas laikā izvēlēsies pareizo funkciju.

Kompilācijas laika polimorfisms tiek panākts ar funkciju pārslodzi un operatora pārslodzi.

Funkcija Pārslodze

Funkciju pārslodze rodas, ja mums ir daudz funkciju ar līdzīgiem nosaukumiem, bet atšķirīgiem argumentiem. Argumenti var atšķirties pēc skaita vai veida.

1. piemērs:

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

Izeja:

Šeit ir koda ekrānuzņēmums:

Koda skaidrojums:

  1. Iekļaujiet mūsu kodā iostream galvenes failu. Mēs varēsim izmantot tā funkcijas.
  2. Iekļaujiet standarta nosaukumvietu mūsu kodā. Mēs varēsim izmantot tās klases, to nezvanot.
  3. Izveidojiet funkciju ar nosaukumu tests, kas ņem vesela skaitļa parametru i. {Apzīmē funkciju testa sākumu.
  4. Izraksts, kas jāizpilda, ja tiek izsaukts / izsaukts iepriekšminētais funkciju tests.
  5. Iepriekšminētās funkcijas pārbaudes ķermeņa beigas.
  6. Izveidojiet funkciju ar nosaukumu tests, kas ņem pludiņa parametru f. {Apzīmē funkciju testa sākumu.
  7. Izraksts, kas jāizpilda, ja tiek izsaukts / izsaukts iepriekšminētais funkciju tests.
  8. Iepriekšminētā funkciju testa korpusa beigas.
  9. Izveidojiet funkciju ar nosaukumu tests, kas ņem rakstzīmju parametru ch. {Apzīmē funkciju testa sākumu.
  10. Izraksts, kas jāizpilda, ja tiek izsaukts / izsaukts iepriekšminētais funkciju tests.
  11. Iepriekšminētā funkciju testa korpusa beigas.
  12. Izsauciet galveno () funkciju. {Apzīmē funkcijas ķermeņa sākumu.
  13. Izsauciet funkciju testu un nododiet tam 5 kā argumenta vērtību. Tas izsauc testa funkciju, kas pieņem vesela skaitļa argumentu, tas ir, pirmo testa funkciju.
  14. Izsauciet funkciju testu un tam nododot 5.5 kā argumenta vērtību. Tas izsauks testa funkciju, kas pieņem pludiņa argumentu, tas ir, otro testa funkciju.
  15. Izsauciet funkciju testu un nododiet tam piecus kā argumenta vērtību. Tas izsauks testa funkciju, kas pieņem rakstzīmju argumentu, tas ir, trešo testa funkciju.
  16. Programmai ir jāatgriež vērtība, ja tā darbojas veiksmīgi.
  17. Galvenās () funkcijas ķermeņa beigas.

Mums ir trīs funkcijas ar tādu pašu nosaukumu, bet dažāda veida argumentiem. Mēs esam sasnieguši polimorfismu.

Operatora pārslodze

Sadaļā Operatora pārslodze mēs definējam jaunu C ++ operatora nozīmi. Tas arī maina operatora darbību. Piemēram, mēs varam definēt operatoru +, lai savienotu divas virknes. Mēs to zinām kā skaitļu vērtību pievienošanas operatoru. Pēc mūsu definīcijas, tos ievietojot starp veseliem skaitļiem, tie tos pievienos. Ievietojot starp virknēm, tas tos saķers.

2. piemērs:

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

Izeja:

Šeit ir koda ekrānuzņēmums:

Koda skaidrojums:

  1. Iekļaujiet iostream galvenes failu mūsu programmā, lai izmantotu tā funkcijas.
  2. Iekļaujiet standarta nosaukumvietu mūsu programmā, lai izmantotu tās klases, to neizsaucot.
  3. Izveidojiet klasi ar nosaukumu ComplexNum. {Apzīmē klases ķermeņa sākumu.
  4. Izmantojiet privātās piekļuves modifikatoru, lai mainīgos mainītu kā privātus, tas nozīmē, ka tiem var piekļūt tikai no klases.
  5. Definējiet divus veselu skaitļu mainīgos - reālus un lielākus.
  6. Izmantojiet publiskās piekļuves modifikatoru, lai atzīmētu konstruktoru kā publisku, kas nozīmē, ka tas būs pieejams pat ārpus klases.
  7. Izveidojiet klases konstruktoru un inicializējiet mainīgos.
  8. Inicializējiet mainīgā reālā vērtību.
  9. Inicializējiet mainīgā vērtību.
  10. Konstruktora korpusa beigas.
  11. Mums jāatskaita operatora + nozīme.
  12. Izveidojiet ComplexNum tipa datu tipa rezultātu.
  13. Izmantojiet operatoru + ar kompleksiem skaitļiem. Šī rinda skaitļa reālo daļu pievienos cita skaitļa reālajai daļai.
  14. Izmantojiet operatoru + ar kompleksiem skaitļiem. Šī rinda skaitļa iedomāto daļu pievienos cita skaitļa iedomātajai daļai.
  15. Pēc veiksmīgas izpildes programma atgriezīs mainīgā rezultāta vērtību.
  16. + Operatora jaunās nozīmes definīcijas beigas, tas ir, pārslodze.
  17. Izsauciet metodi print ().
  18. Pēc pievienošanas konsolē izdrukājiet jauno kompleksa numuru.
  19. Funkcijas pamatteksta () beigas.
  20. ComplexNum klases korpusa beigas.
  21. Izsauciet galveno () funkciju.
  22. Nododiet pievienojamo reālo un sarežģīto daļu vērtības. C1 pirmā daļa tiks pievienota c2 pirmajai daļai, tas ir, 10 + 3. C1 otrā daļa tiks pievienota c otrajai daļai, tas ir, 2 + 7.
  23. Veiciet darbību, izmantojot pārslogotu + operatoru un saglabājot rezultātu mainīgajā c3.
  24. Drukājiet konsolē mainīgā c3 vērtību.
  25. Galvenās () funkcijas ķermeņa beigas.

Izpildlaika polimorfisms

Tas notiek, kad objekta metode tiek izsaukta / izsaukta izpildes laikā, nevis kompilēšanas laikā. Izpildlaika polimorfisms tiek sasniegts, ignorējot funkciju. Funkcija, kuru izsaukt / izsaukt, tiek izveidota izpildlaika laikā.

Funkcijas ignorēšana

Funkciju ignorēšana notiek, ja pamatklases funkcijai tiek piešķirta jauna definīcija atvasinātajā klasē. Tajā laikā mēs varam teikt, ka bāzes funkcija ir ignorēta.

Piemēram:

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

Izeja:

Šeit ir koda ekrānuzņēmums:

Koda skaidrojums:

  1. Importējiet iostream galvenes failu mūsu programmā, lai izmantotu tā funkcijas.
  2. Iekļaujiet standarta nosaukumvietu mūsu programmā, lai izmantotu tās klases, to neizsaucot.
  3. Izveidojiet klasi ar nosaukumu Zīdītājs. {Apzīmē klases ķermeņa sākumu.
  4. Izmantojiet publiskās piekļuves modifikatoru, lai funkciju, kuru mēs gatavojamies izveidot, iestatītu kā publiski pieejamu. Tas būs pieejams ārpus šīs klases.
  5. Izveidojiet publisku funkciju ar nosaukumu ēst. {Apzīmē funkcijas ķermeņa sākumu.
  6. Izdrukājiet paziņojumu, kas pievienots funkcijai cout, kad tiek izsaukta funkcija eat ().
  7. Funkcijas ķermeņa beigas ēd ().
  8. Zīdītāju klases ķermeņa beigas.
  9. Izveidojiet klasi ar nosaukumu Govs, kas pārņem zīdītāju klasi. Govs ir atvasinātā klase, savukārt zīdītājs ir bāzes klase. {Iezīmē šīs klases sākumu.
  10. Izmantojiet publiskās piekļuves modifikatoru, lai iezīmētu funkciju, kuru mēs gatavojamies izveidot, kā publiski pieejamu. Tas būs pieejams ārpus šīs klases.
  11. Ignorēt funkciju eat (), kas tika definēta bāzes klasē. {Apzīmē funkcijas ķermeņa sākumu.
  12. Izraksts, ko drukāt uz konsoles, kad tiek izsaukta šī funkcija.
  13. Funkcijas ēšanas ķermeņa beigas ().
  14. Govs klases ķermeņa beigas.
  15. Izsauciet galveno () funkciju. {Iezīmē šīs funkcijas pamatteksta sākumu.
  16. Izveidojiet klases Govs gadījumu un piešķiriet tam nosaukumu c.
  17. Izsauciet funkciju Govs definēto ēst ().
  18. Pēc sekmīgas pabeigšanas programmai jāatgriež vērtība.
  19. Galvenās () funkcijas beigas.

C ++ virtuālā funkcija

Virtuālā funkcija ir vēl viens veids, kā izpildes laika polimorfismu ieviest C ++. Tā ir īpaša funkcija, kas definēta bāzes klasē un atkārtoti definēta atvasinātajā klasē. Lai deklarētu virtuālo funkciju, jums jāizmanto virtuālais atslēgvārds. Atslēgvārdam vajadzētu būt pirms funkcijas deklarēšanas bāzes klasē.

Ja virtuālā funkciju klase tiek mantota, virtuālā klase pārdefinē virtuālo funkciju atbilstoši tās vajadzībām. Piemēram:

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

Izeja:

Šeit ir koda ekrānuzņēmums:

Koda skaidrojums:

  1. Iekļaujiet kodā iostream galvenes failu, lai izmantotu tā funkcijas.
  2. Iekļaujiet standarta koda telpu mūsu kodā, lai izmantotu tās klases, to neizsaucot.
  3. Izveidojiet klasi ar nosaukumu ClassA.
  4. Izmantojiet publiskās piekļuves modifikatoru, lai atzīmētu klases biedru kā publiski pieejamu.
  5. Izveidojiet virtuālu funkciju ar nosaukumu show (). Tā būs publiska funkcija.
  6. Drukājamais teksts, kad tiek izsaukta izrāde (), tiek izsaukta. Endl ir C ++ atslēgvārds, kas nozīmē beigu līniju. Tas pārvieto peles kursoru uz nākamo rindu.
  7. Virtuālās funkcijas šova () pamatteksts.
  8. A klases korpusa beigas.
  9. Izveidojot jaunu klasi ar nosaukumu ClassB, kas pārņem klasi A. A klase kļūst par pamatklasi, bet B klase - par atvasināto klasi.
  10. Izmantojiet publiskās piekļuves modifikatoru, lai atzīmētu klases biedru kā publiski pieejamu.
  11. No jauna definējiet virtuālo funkciju šovu (), kas iegūts bāzes klasē.
  12. Teksts, kas drukājams uz konsoles, kad tiek izsaukta atvasinātajā klasē noteiktā funkcija show ().
  13. Izrādes () funkcijas pamatteksts.
  14. Atvasinātās klases B korpusa beigas.
  15. Izsauciet galveno () funkciju. Programmas loģika jāpievieno tās pamattekstā.
  16. Izveidojiet rādītāja mainīgo ar nosaukumu a. Tas norāda uz klasi, kuras nosaukums ir A klase.
  17. Izveidojiet klases instanci ar nosaukumu ClassB. Gadījumam tiek dots nosaukums b.
  18. Piešķiriet vērtību krājumus mainīgā a adresē b.
  19. Izsaukt funkciju show (), kas definēta atvasinātajā klasē. Ir ieviesta novēlota saistīšana.
  20. Galvenās () funkcijas ķermeņa beigas.

Sastādīšanas laika polimorfisms Vs. Ekspluatācijas laika polimorfisms

Šeit ir galvenās atšķirības starp abiem:

Kompilācijas laika polimorfisms Ekspluatācijas laika polimorfisms
To sauc arī par agrīnu saistīšanos vai statisku polimorfismu To sauc arī par vēlu / dinamisku saistīšanos vai dinamisku polimorfismu
Metode tiek izsaukta / izsaukta sastādīšanas laikā Metode tiek izsaukta / izsaukta darbības laikā
To īsteno, izmantojot funkciju pārslodzi un operatora pārslodzi Īstenots, izmantojot metodes primārās un virtuālās funkcijas
Piemērs, metodes pārslodze. Daudzām metodēm var būt līdzīgi nosaukumi, bet atšķirīgs argumentu skaits vai veidi Piemērs, metode ignorē. Daudzām metodēm var būt līdzīgs nosaukums un viens un tas pats prototips.
Ātrāka izpilde, jo metožu meklēšana tiek veikta kompilēšanas laikā Lēnāka izpilde, jo metožu atklājējs tiek veikts izpildlaika laikā.
Tiek nodrošināta mazāka elastība problēmu risināšanā, jo viss ir zināms sastādīšanas laikā. Liela elastība tiek nodrošināta sarežģītu problēmu risināšanai, jo metodes tiek atklātas izpildlaika laikā.

Kopsavilkums:

  • Polimorfisms nozīmē, ka tam ir daudz formu.
  • Tas notiek, ja pastāv mantojuma dēļ saistītu klašu hierarhija.
  • Izmantojot polimorfismu, funkcija var izturēties atšķirīgi, pamatojoties uz objektu, kas to izsauc / izsauc.
  • Kompilēšanas laika polimorfismā funkcija, kas jāizsauc, tiek izveidota kompilēšanas laikā.
  • Runtime polimorfismā funkcija, kas jāizsauc, tiek noteikta izpildlaika laikā.
  • Kompilācijas laika polimorfismu nosaka, izmantojot funkciju pārslodzi un operatora pārslodzi.
  • Funkciju pārslodzē ir daudz funkciju ar līdzīgiem nosaukumiem, bet atšķirīgiem argumentiem.
  • Parametri var atšķirties pēc skaita vai veida.
  • Operatora pārslodzē C ++ operatoriem ir noteikta jauna nozīme.
  • Izpildlaika polimorfisms tiek sasniegts, ignorējot funkciju.
  • Funkcijas ignorēšanas gadījumā atvasinātā klase piešķir jaunu definīciju funkcijai, kas definēta bāzes klasē.