C ++ polimorfizmas su pavyzdžiu

Kas yra C ++ polimorfizmas?

C ++, polimorfizmas priverčia nario funkciją elgtis skirtingai, remiantis objektu, kuris ją kviečia / iškviečia. Polimorfizmas yra graikų kalbos žodis, reiškiantis, kad turi daugybę formų. Tai atsitinka, kai turite klasių, susijusių su paveldėjimu, hierarchiją.

Pavyzdžiui, tarkime, kad turime funkciją makeSound (). Kai katė paskambins į šią funkciją, ji sukels miau garsą. Kai karvė pasinaudos ta pačia funkcija, ji suteiks moow garsą.

Nors turime vieną funkciją, skirtingomis aplinkybėmis ji elgiasi skirtingai. Funkcija turi daugybę formų; taigi mes pasiekėme polimorfizmą.

Šioje C ++ pamokoje sužinosite:

  • Kas yra polimorfizmas?
  • Polimorfizmo tipai
  • Sudarykite laiko polimorfizmą
  • Funkcija Perkrovimas
  • Operatoriaus perkrova
  • Vykdymo laiko polimorfizmas
  • Funkcijos svarbesnė
  • C ++ virtuali funkcija
  • Kompiliavimo laiko polimorfizmas, palyginti su Vykdymo laiko polimorfizmas

Polimorfizmo tipai

C ++ palaiko dviejų tipų polimorfizmą:

  • Kompiliavimo laiko polimorfizmas ir
  • Vykdymo laiko polimorfizmas.

Sudarykite laiko polimorfizmą

Perkrautas funkcijas iškviečiate suderindami argumentų skaičių ir tipą. Informacija pateikiama kompiliavimo metu. Tai reiškia, kad kompiliatorius C ++ kompiliavimo metu pasirinks tinkamą funkciją.

Kompiliavimo laiko polimorfizmas pasiekiamas perkrovus funkciją ir perkraunant operatorių.

Funkcija Perkrovimas

Funkcijų perkrova įvyksta, kai turime daug funkcijų su panašiais pavadinimais, bet skirtingais argumentais. Argumentai gali skirtis pagal skaičių ar tipą.

1 pavyzdys:

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

Išvestis:

Čia yra kodo ekrano kopija:

Kodo paaiškinimas:

  1. Įtraukite „iostream“ antraštės failą į mūsų kodą. Galėsime naudotis jo funkcijomis.
  2. Įtraukite standartinę vardų sritį į mūsų kodą. Mes galėsime naudotis jo klasėmis, nepaskambinę.
  3. Sukurkite funkciją, pavadintą testas, kuriai imamas sveikasis skaičius i parametras. {Žymi funkcijos testo kūno pradžią.
  4. Pareiškimas, kurį reikia atlikti, jei iškviečiamas / iškviečiamas aukščiau nurodytas funkcijos testas.
  5. Pirmiau nurodyto funkcijos testo korpuso pabaiga.
  6. Sukurkite funkciją pavadinimu testas, kuriam reikia plūduriuojančio parametro f. {Žymi funkcijos testo kūno pradžią.
  7. Pareiškimas, kurį reikia atlikti, jei iškviečiamas / iškviečiamas aukščiau nurodytas funkcijos testas.
  8. Pirmiau minėto funkcijos bandymo korpuso pabaiga.
  9. Sukurkite funkciją, pavadintą testas, atlikdamas simbolio parametrą ch. {Žymi funkcijos testo kūno pradžią.
  10. Pareiškimas, kurį reikia atlikti, jei iškviečiamas / iškviečiamas aukščiau nurodytas funkcijos testas.
  11. Pirmiau minėto funkcijos bandymo korpuso pabaiga.
  12. Iškvieskite pagrindinę () funkciją. {Žymi funkcijos kūno pradžią.
  13. Iškvieskite funkcijos testą ir perduokite jam 5 kaip argumento vertę. Tai iškviečia bandymo funkciją, kuri priima sveiko skaičiaus argumentą, tai yra pirmąją bandymo funkciją.
  14. Iškvieskite funkcijos testą ir perduokite jam 5.5 kaip argumento vertę. Tai iškvies bandymo funkciją, kuri priims „float“ argumentą, tai yra antrąją bandymo funkciją.
  15. Iškvieskite funkcijos testą ir perduokite jam penkis kaip argumento vertę. Tai iškvies testo funkciją, kuri priims simbolio argumentą, tai yra trečiąją bandymo funkciją.
  16. Jei programa sėkmingai vykdoma, programa turi grąžinti vertę.
  17. Pagrindinės () funkcijos kūno pabaiga.

Mes turime tris funkcijas tuo pačiu pavadinimu, bet skirtingų tipų argumentais. Mes pasiekėme polimorfizmą.

Operatoriaus perkrova

Operatoriaus perkrovime mes apibrėžiame naują C ++ operatoriaus reikšmę. Tai taip pat keičia operatoriaus darbą. Pavyzdžiui, galime apibrėžti operatorių +, kad sujungtų dvi eilutes. Mes jį žinome kaip skaitinių verčių pridėjimo operatorių. Pagal mūsų apibrėžimą, kai jie dedami tarp sveikųjų skaičių, jie juos pridės. Įdėjus tarp stygų, jis jas sujungs.

2 pavyzdys:

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

Išvestis:

Čia yra kodo ekrano kopija:

Kodo paaiškinimas:

  1. Įtraukite „iostream“ antraštės failą į mūsų programą, kad galėtumėte naudoti jo funkcijas.
  2. Įtraukite standartinę vardų sritį į mūsų programą, kad galėtumėte naudoti jos klases nepaskambinę.
  3. Sukurkite klasę pavadinimu „ComplexNum“. {Žymi klasės kūno pradžią.
  4. Norėdami pažymėti kintamuosius kaip privačius, naudokite privačios prieigos modifikatorių, o tai reiškia, kad prie jų galima pasiekti tik iš klasės.
  5. Apibrėžkite du sveikojo skaičiaus kintamuosius, tikrąjį ir didesnį.
  6. Naudokite viešosios prieigos modifikatorių, kad pažymėtumėte konstruktorių kaip viešą, o tai reiškia, kad jis bus prieinamas net už klasės ribų.
  7. Sukurkite klasės konstruktorių ir inicijuokite kintamuosius.
  8. Inicializuokite kintamojo realiąją vertę.
  9. Inicializuokite kintamojo reikšmę.
  10. Konstruktoriaus korpuso pabaiga.
  11. Turime nepaisyti + operatoriaus reikšmės.
  12. Sukurkite „ComplexNum“ tipo duomenų tipo rezultatą.
  13. Naudokite + operatorių su sudėtingais skaičiais. Ši eilutė pridės tikrąją skaičiaus dalį prie realaus kito skaičiaus.
  14. Naudokite + operatorių su sudėtingais skaičiais. Ši eilutė pridės įsivaizduojamą skaičiaus dalį prie įsivaizduojamos kito skaičiaus dalies.
  15. Sėkmingai įvykdžius, programa grąžins kintamojo rezultato vertę.
  16. Naujos + operatoriaus reikšmės apibrėžimo pabaiga, tai yra perkrovimas.
  17. Iškvieskite spausdinimo () metodą.
  18. Po papildymo konsolėje atspausdinkite naują komplekso numerį.
  19. Funkcijos „Spausdinti“ () funkcijos pabaiga.
  20. „ComplexNum“ klasės kėbulo pabaiga.
  21. Iškvieskite pagrindinę () funkciją.
  22. Perduokite tiek realių, tiek sudėtingų dalių vertes, kurias norite pridėti. Pirmoji c1 dalis bus pridėta prie pirmosios c2 dalies, tai yra, 10 + 3. Antroji c1 dalis bus pridėta prie antrosios c dalies, ty 2 + 7.
  23. Atlikite operaciją naudodami perkrautą + operatorių ir išsaugodami rezultatą kintamajame c3.
  24. Į konsolę atsispausdinkite kintamojo c3 vertę.
  25. Pagrindinės () funkcijos kūno pabaiga.

Vykdymo laiko polimorfizmas

Taip atsitinka, kai objekto metodas yra iškviečiamas / iškviečiamas vykdymo metu, o ne kompiliavimo metu. Vykdymo laiko polimorfizmas pasiekiamas perduodant funkciją. Funkcija, kurią reikia iškviesti / iškviesti, nustatoma vykdymo metu.

Funkcijos svarbesnė

Funkcijų nepaisymas įvyksta, kai išvestinės klasės bazinės klasės funkcijai suteikiamas naujas apibrėžimas. Tuo metu galime sakyti, kad bazinė funkcija buvo nepaisoma.

Pavyzdžiui:

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

Išvestis:

Čia yra kodo ekrano kopija:

Kodo paaiškinimas:

  1. Importuokite „iostream“ antraštės failą į mūsų programą, kad galėtumėte naudoti jo funkcijas.
  2. Įtraukite standartinę vardų sritį į mūsų programą, kad galėtumėte naudoti jos klases nepaskambinę.
  3. Sukurkite klasę pavadinimu Žinduolis. {Žymi klasės kūno pradžią.
  4. Naudodami viešosios prieigos modifikatorių nustatykite funkciją, kurią mes ketiname sukurti kaip viešai prieinamą. Ją bus galima pasiekti ne iš šios klasės.
  5. Sukurkite viešąją funkciją, pavadintą valgyti. {Žymi funkcijos kūno pradžią.
  6. Atspausdinkite teiginį, pridėtą prie „cout“ funkcijos, kai iškviečiama funkcija eat ().
  7. Funkcijos kūno pabaiga valgyti ().
  8. Žinduolių klasės kūno pabaiga.
  9. Sukurkite klasę pavadinimu „Karvė“, kuri paveldės žinduolių klasę. Karvė yra išvestinė klasė, o žinduolis yra pagrindinė klasė. {Žymi šios klasės pradžią.
  10. Naudodami viešosios prieigos modifikatorių pažymėkite funkciją, kurią ketiname sukurti kaip viešai prieinamą. Ją bus galima pasiekti ne iš šios klasės.
  11. Nepaisyti funkcijos eat (), kuri buvo apibrėžta pagrindinėje klasėje. {Žymi funkcijos kūno pradžią.
  12. Pareiškimas, kurį reikia atspausdinti konsolėje, kai naudojama ši funkcija.
  13. Funkcijos valgyti kūno pabaiga ().
  14. Karvės klasės kūno pabaiga.
  15. Iškvieskite pagrindinę () funkciją. {Žymi šios funkcijos kūno pradžią.
  16. Sukurkite Karvės klasės egzempliorių ir suteikite jam pavadinimą c.
  17. Iškvieskite karvės klasėje apibrėžtą valgyti () funkciją.
  18. Sėkmingai baigusi programa turi grąžinti vertę.
  19. Pagrindinės () funkcijos pabaiga.

C ++ virtuali funkcija

Virtuali funkcija yra dar vienas vykdymo laiko polimorfizmo diegimo būdas C ++. Tai yra speciali funkcija, apibrėžta bazinėje klasėje ir apibrėžta išvestinėje klasėje. Norėdami deklaruoti virtualią funkciją, turėtumėte naudoti virtualų raktinį žodį. Raktinis žodis turėtų būti pateiktas prieš funkcijos deklaravimą pagrindinėje klasėje.

Jei virtuali funkcijų klasė yra paveldima, virtuali klasė iš naujo apibrėžia virtualią funkciją, kad atitiktų jos poreikius. Pavyzdžiui:

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

Išvestis:

Čia yra kodo ekrano kopija:

Kodo paaiškinimas:

  1. Įtraukite „iostream“ antraštės failą į kodą, kad galėtumėte naudoti jo funkcijas.
  2. Įtraukite standartinę vardų sritį į mūsų kodą, kad galėtumėte naudoti jos klases nepaskambinę.
  3. Sukurkite klasę pavadinimu „ClassA“.
  4. Norėdami pažymėti klasės narį kaip viešai prieinamą, naudokite viešosios prieigos modifikatorių.
  5. Sukurkite virtualią funkciją pavadinimu show (). Tai bus viešoji funkcija.
  6. Tekstas, kurį reikia spausdinti, kai iškviečiama paroda (), yra iškviečiamas. Pabaiga yra C ++ raktinis žodis, kuris reiškia pabaigos eilutę. Jis perkelia pelės žymeklį į kitą eilutę.
  7. Virtualiosios funkcijos šou () turinio pabaiga.
  8. A klasės kėbulo galas.
  9. Sukuriama nauja klasė, pavadinta „ClassB“, kuri paveldi klasę „A“. A klasė tampa pagrindine, o B klasė - išvestine.
  10. Norėdami pažymėti klasės narį kaip viešai prieinamą, naudokite viešosios prieigos modifikatorių.
  11. Iš naujo apibrėžkite virtualią funkcijų parodą (), gautą bazinėje klasėje.
  12. Tekstas, kurį reikia atspausdinti konsolėje, kai iškviečiama išvestinėje klasėje apibrėžta funkcija show ().
  13. „Show“ () funkcijos kūno pabaiga.
  14. Išvestinės klasės, B klasės, korpuso pabaiga.
  15. Iškvieskite pagrindinę () funkciją. Programos logika turėtų būti įtraukta į jos turinį.
  16. Sukurkite žymeklio kintamąjį, pavadintą a. Tai rodo klasę, vadinamą A klase.
  17. Sukurkite klasės egzempliorių, pavadintą „ClassB“. Egzemplioriui suteikiamas vardas b.
  18. Priskirkite kintamojo a adreso b reikšmių atsargas.
  19. Iškvieskite funkciją show (), apibrėžtą išvestinėje klasėje. Vėlyvas įrišimas buvo įgyvendintas.
  20. Pagrindinės () funkcijos kūno pabaiga.

Kompiliavimo laiko polimorfizmas, palyginti su Vykdymo laiko polimorfizmas

Čia yra pagrindiniai šių dviejų skirtumai:

Kompiliacinis laiko polimorfizmas Vykdymo laiko polimorfizmas
Tai taip pat vadinama ankstyvuoju surišimu arba statiniu polimorfizmu Tai dar vadinama vėlyvuoju / dinaminiu surišimu arba dinaminiu polimorfizmu
Metodas iškviečiamas / iškviečiamas kompiliavimo metu Metodas yra vadinamas / iškviečiamas vykdymo metu
Vykdoma per funkcijų perkrovimą ir operatoriaus perkrovimą Įgyvendinama per svarbiausias metodo ir virtualias funkcijas
Pavyzdys, metodo perkrova. Daugelis metodų gali turėti panašius pavadinimus, tačiau skirtingų argumentų skaičių ar tipus Pavyzdys, metodas svarbesnis. Daugelis metodų gali turėti panašų pavadinimą ir tą patį prototipą.
Greitesnis vykdymas, nes metodų atradimas atliekamas kompiliavimo metu Lėtesnis vykdymas, nes metodo atradėjas atliekamas vykdymo metu.
Suteikiama mažiau lankstumo sprendžiant problemas, nes kompiliavimo metu viskas yra žinoma. Sudėtingoms problemoms spręsti suteikiama daug lankstumo, nes metodai atrandami vykdymo metu.

Santrauka:

  • Polimorfizmas reiškia turėti daugybę formų.
  • Jis įvyksta, kai yra paveldėjimo būdu susijusių klasių hierarchija.
  • Naudojant polimorfizmą, funkcija gali elgtis kitaip, remdamasi objektu, kuris ją iškviečia / vadina.
  • Sudarant laiko polimorfizmą, funkcija, kuria reikia remtis, nustatoma kompiliavimo metu.
  • Vykdymo laiko polimorfizme funkcija, kuria reikia remtis, nustatoma vykdymo metu.
  • Kompiliavimo laiko polimorfizmas nustatomas perkeliant funkciją ir perkraunant operatorių.
  • Perkraunant funkcijas, yra daugybė funkcijų su panašiais pavadinimais, bet skirtingais argumentais.
  • Parametrai gali skirtis skaičiumi ar tipu.
  • Operatoriaus perkrovos atveju C ++ operatoriams apibrėžta nauja reikšmė.
  • Vykdymo laiko polimorfizmas pasiekiamas perduodant funkciją.
  • Nepaisydama funkcijos, išvestinė klasė suteikia naują apibrėžimą pagrindinėje klasėje apibrėžtai funkcijai.

Įdomios straipsniai...