Što je polimorfizam u C ++?
U C ++-u polimorfizam uzrokuje da se funkcija člana ponaša drugačije na temelju objekta koji ga poziva / poziva. Polimorfizam je grčka riječ koja znači imati mnogo oblika. To se događa kada imate hijerarhiju klasa povezanih nasljeđivanjem.
Na primjer, pretpostavimo da imamo funkciju makeSound (). Kada mačka pozove ovu funkciju, proizvest će zvuk mijauka. Kad se krava pozove na istu funkciju, pružit će zvuk košnje.
Iako imamo jednu funkciju, ona se pod različitim okolnostima ponaša drugačije. Funkcija ima mnogo oblika; dakle, postigli smo polimorfizam.
U ovom C ++ tutorialu naučit ćete:
- Što je polimorfizam?
- Vrste polimorfizma
- Sastaviti vremenski polimorfizam
- Preopterećenje funkcije
- Preopterećenje operatera
- Runtime polimorfizam
- Nadjačavanje funkcije
- C ++ virtualna funkcija
- Vrijeme polimorfizma kompilacije vs. Polimorfizam vremena izvođenja
Vrste polimorfizma
C ++ podržava dvije vrste polimorfizma:
- Polimorfizam kompilacije i
- Izvršni polimorfizam.
Sastaviti vremenski polimorfizam
Preopterećene funkcije pozivate podudaranjem broja i vrste argumenata. Podaci su prisutni tijekom vremena prevođenja. To znači da će prevoditelj C ++ odabrati pravu funkciju u vrijeme sastavljanja.
Polimorfizam kompajliranog vremena postiže se preopterećenjem funkcije i preopterećenjem operatora.
Preopterećenje funkcije
Preopterećenje funkcije događa se kada imamo mnogo funkcija sa sličnim imenima, ali različitim argumentima. Argumenti se mogu razlikovati u pogledu broja ili vrste.
Primjer 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;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš kod. Moći ćemo koristiti njegove funkcije.
- Uključite std prostor imena u naš kod. Moći ćemo koristiti njegove klase bez pozivanja.
- Stvorite funkciju nazvanu test koja uzima cjelobrojni parametar i. Oznaka {označava početak ispitivanja tijela funkcije.
- Izjava koju treba izvršiti ako se pozove / pozove gornji test funkcije.
- Kraj tijela gornjeg ispitivanja funkcije.
- Stvorite funkciju nazvanu test koja uzima float parametar f. Oznaka {označava početak ispitivanja tijela funkcije.
- Izjava koju treba izvršiti ako se pozove / pozove gornji test funkcije.
- Kraj tijela gornjeg ispitivanja funkcije.
- Stvorite funkciju nazvanu test koja uzima parametar karaktera ch. Oznaka {označava početak ispitivanja tijela funkcije.
- Izjava koju treba izvršiti ako se pozove / pozove gornji test funkcije.
- Kraj tijela gornjeg ispitivanja funkcije.
- Pozovite glavnu () funkciju. Oznaka {označava početak tijela funkcije.
- Pozovite test funkcije i proslijedite mu 5 kao vrijednost argumenta. Ovo poziva test funkciju koja prihvaća cjelobrojni argument, odnosno prvu test funkciju.
- Pozovite test funkcije i proslijedite mu 5.5 kao vrijednost argumenta. Ovo će pozvati test funkciju koja prihvaća float argument, odnosno drugu test funkciju.
- Pozovite test funkcije i proslijedite mu pet kao vrijednost argumenta. Ovo će pozvati test funkciju koja prihvaća argument znaka, odnosno treću testnu funkciju.
- Ako se uspješno izvodi, program mora vratiti vrijednost.
- Kraj tijela glavne () funkcije.
Imamo tri funkcije s istim imenom, ali različite vrste argumenata. Postigli smo polimorfizam.
Preopterećenje operatera
U Preopterećenju operatora definiramo novo značenje za C ++ operatora. Također se mijenja način rada operatora. Na primjer, možemo definirati + operator koji spaja dva niza. Znamo ga kao operator zbrajanja za zbrajanje numeričkih vrijednosti. Nakon naše definicije, stavit će ih između cijelih brojeva. Kad se stave između nizova, spojit će ih.
Primjer 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();}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite iostream datoteku zaglavlja u naš program kako biste koristili njegove funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Stvorite klasu nazvanu ComplexNum. {Označava početak predavanja.
- Koristite modifikator privatnog pristupa za označavanje varijabli kao privatnih, što znači da im se može pristupiti samo unutar klase.
- Definirajte dvije cjelobrojne varijable, realnu i više.
- Koristite modifikator javnog pristupa da biste konstruktor označili kao javni, što znači da će mu biti dostupan čak i izvan klase.
- Stvorite konstruktor klase i inicijalizirajte varijable.
- Inicijalizirajte vrijednost varijable real.
- Inicijalizirajte vrijednost varijable over.
- Kraj tijela konstruktora.
- Moramo nadjačati značenje + operatora.
- Stvorite rezultat tipa podataka tipa ComplexNum.
- Koristite operator + sa složenim brojevima. Ovaj će redak dodati stvarni dio broja stvarnom dijelu drugog broja.
- Koristite operator + sa složenim brojevima. Ovaj će redak zamišljeni dio broja dodati imaginarnom dijelu drugog broja.
- Program će vratiti vrijednost varijable rezultata nakon uspješnog izvršavanja.
- Kraj definicije novog značenja + operatora, odnosno preopterećenja.
- Pozovite metodu print ().
- Ispišite novi složeni broj nakon dodavanja na konzolu.
- Kraj funkcije body of print ().
- Kraj tijela klase ComplexNum.
- Pozovite glavnu () funkciju.
- Proslijedite vrijednosti stvarnih i složenih dijelova koje želite dodati. Prvi dio c1 bit će dodan prvom dijelu c2, odnosno 10 + 3. Drugi dio c1 bit će dodan drugom dijelu c, odnosno 2 + 7.
- Izvršite operaciju pomoću preopterećenog + operatora i pohranite rezultat u varijablu c3.
- Ispišite vrijednost varijable c3 na konzoli.
- Kraj tijela glavne () funkcije.
Runtime polimorfizam
To se događa kada se metoda objekta poziva / poziva tijekom izvođenja, a ne tijekom vremena kompajliranja. Polimorfizam izvođenja postiže se nadjačavanjem funkcije. Funkcija koju treba pozvati / pozvati uspostavlja se tijekom izvođenja.
Nadjačavanje funkcije
Nadjačavanje funkcije događa se kada funkcija osnovne klase dobije novu definiciju u izvedenoj klasi. U to vrijeme možemo reći da je osnovna funkcija nadjačana.
Na primjer:
#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;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uvezite datoteku zaglavlja iostream u naš program da biste koristili njegove funkcije.
- Uključite prostor imena std u naš program kako biste koristili njegove klase bez pozivanja.
- Stvorite razred s imenom Sisavac. {Označava početak predavanja.
- Pomoću modifikatora javnog pristupa postavite funkciju koju ćemo stvoriti kao javno dostupnu. Bit će mu dostupno izvan ovog razreda.
- Stvorite javnu funkciju pod nazivom jesti. Znak {označava početak tijela funkcije.
- Ispišite izraz dodan funkciji cout kada se pozove funkcija eat ().
- Kraj tijela funkcije jesti ().
- Kraj tijela klase Sisavci.
- Stvorite razred s imenom Krava koji nasljeđuje klasu Sisavci. Krava je izvedena klasa, dok je sisavci osnovna klasa. {Označava početak ove nastave.
- Pomoću modifikatora javnog pristupa označite funkciju koju ćemo stvoriti kao javno dostupnu. Bit će mu dostupno izvan ovog razreda.
- Nadjačajte funkciju eat () koja je definirana u osnovnoj klasi. Znak {označava početak tijela funkcije.
- Izjava za ispis na konzoli kada se pozove ova funkcija.
- Kraj tijela funkcije eat ().
- Kraj tijela klase Krava.
- Pozovite glavnu () funkciju. Oznaka {označava početak tijela ove funkcije.
- Stvorite instancu klase Cow i dajte joj ime c.
- Pozovite funkciju eat () definiranu u klasi Cow.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj glavne () funkcije.
C ++ virtualna funkcija
Virtualna funkcija je još jedan način implementacije polimorfizma tijekom izvođenja u C ++. To je posebna funkcija definirana u osnovnoj klasi i redefinirana u izvedenoj klasi. Da biste proglasili virtualnu funkciju, trebali biste upotrijebiti virtualnu ključnu riječ. Ključna riječ trebala bi prethoditi deklaraciji funkcije u osnovnoj klasi.
Ako se klasa virtualne funkcije naslijedi, virtualna klasa redefinira virtualnu funkciju prema svojim potrebama. Na primjer:
#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();}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uključite datoteku zaglavlja iostream u kôd da biste koristili njegove funkcije.
- Uključite std prostor imena u naš kôd da biste koristili njegove klase bez pozivanja.
- Stvorite klasu pod nazivom ClassA.
- Upotrijebite modifikator javnog pristupa da biste člana razreda označili kao javno dostupan.
- Stvorite virtualnu funkciju pod nazivom show (). To će biti javna funkcija.
- Tekst za ispis kada se pozove show (). Endl je ključna riječ C ++, što znači završni redak. Premješta kursor miša u sljedeći redak.
- Kraj tijela virtualne funkcije show ().
- Kraj tijela klase ClassA.
- Stvaranje nove klase nazvane ClassB koja nasljeđuje klasu ClassA. ClassA postaje osnovna klasa, dok ClassB postaje izvedena klasa.
- Upotrijebite modifikator javnog pristupa da biste člana razreda označili kao javno dostupan.
- Redefinirajte virtualnu funkciju show () izvedenu u osnovnoj klasi.
- Tekst za ispis na konzoli kada se pozove funkcija show () definirana u izvedenoj klasi.
- Kraj tijela funkcije show ().
- Kraj tijela izvedene klase, ClassB.
- Pozovite glavnu () funkciju. Logiku programa treba dodati unutar svog tijela.
- Stvorite pokazivačku varijablu pod nazivom a. Ukazuje na razred nazvan ClassA.
- Stvorite instancu klase nazvane ClassB. Instanci je dato ime b.
- Dodijelite spremišta vrijednosti na adresi b u varijabli a.
- Pozovite funkciju show () definiranu u izvedenoj klasi. Provedeno je kasno vezivanje.
- Kraj tijela glavne () funkcije.
Vrijeme polimorfizma kompilacije vs. Polimorfizam vremena izvođenja
Evo glavnih razlika između njih dvoje:
Polimorfizam kompilacije | Polimorfizam vremena izvođenja |
Naziva se i ranim vezanjem ili statičkim polimorfizmom | Također se naziva kasno / dinamičko vezanje ili dinamički polimorfizam |
Metoda se poziva / poziva tijekom vremena kompajliranja | Metoda se poziva / poziva tijekom vremena izvođenja |
Provedeno preko preopterećenja funkcije i preopterećenja operatera | Provedeno putem nadjačavanja metoda i virtualnih funkcija |
Primjer, preopterećenje metode. Mnoge metode mogu imati slična imena, ali različiti broj ili vrste argumenata | Primjer, poništavanje metode. Mnoge metode mogu imati slično ime i isti prototip. |
Brže izvršavanje jer se otkrivanje metoda vrši tijekom vremena kompajliranja | Sporije izvršavanje jer se otkrivač metode vrši tijekom izvođenja. |
Pruža se manje fleksibilnosti za rješavanje problema jer se sve zna tijekom vremena kompajliranja. | Za rješavanje složenih problema pruža se velika fleksibilnost jer se metode otkrivaju tijekom izvođenja. |
Sažetak:
- Polimorfizam znači imati mnogo oblika.
- Pojavljuje se kada postoji hijerarhija klasa povezanih nasljeđivanjem.
- S polimorfizmom, funkcija se može ponašati drugačije na temelju objekta koji ga poziva / poziva.
- U polimorfizmu vremena prevođenja, funkcija na koju se poziva uspostavlja se tijekom vremena prevođenja.
- U polimorfizmu izvođenja, funkcija na koju se poziva uspostavlja se tijekom izvođenja.
- Polimorfizam kompajliranog vremena određuje se preopterećenjem funkcije i preopterećenjem operatora.
- U preopterećenju funkcija postoji mnogo funkcija sa sličnim imenima, ali različitim argumentima.
- Parametri se mogu razlikovati po broju ili tipu.
- U preopterećenju operatora definirano je novo značenje za C ++ operatore.
- Polimorfizam izvođenja postiže se nadjačavanjem funkcije.
- U nadjačavanju funkcije, izvedena klasa daje novu definiciju funkciji definiranoj u osnovnoj klasi.