polymorphism c
Uloga polimorfizma u C ++ s primjerima.
Polimorfizam je jedan od četiri stupa objektno orijentiranog programiranja. Polimorfizam znači imati mnogo oblika. Može se definirati kao tehnika kojom objekt može poprimiti različite oblike ovisno o situaciji.
U programskom smislu možemo reći da se objekt može različito ponašati u različitim uvjetima.
U ovom uputstvu naučit ćemo o vrstama polimorfizma, načinima provedbe polimorfizma, zajedno s raznim drugim konceptima polimorfizma.
=> Ovdje pogledajte kako biste ovdje vidjeli A-Z C + tutorijala za obuku.
Na primjer, žena može preuzeti različite uloge u različitim situacijama. Djetetu je ona majka, domaćica kod kuće, radnica u uredu itd. Dakle, žena preuzima različite uloge i pokazuje različito ponašanje u različitim uvjetima. Ovo je stvarni primjer polimorfizma.
Slično u programskom svijetu, također možemo imati operator '+' koji je binarni zbrajni operator koji se ponaša drugačije kada se operandi promijene. Na primjer, kada su oba operanda numerička, izvodi zbrajanje.
S druge strane, kada su operandi niz, on djeluje kao operator spajanja. Stoga, ukratko, polimorfizam znači entitet koji poprima mnoge oblike ili se drugačije ponaša pod različitim uvjetima.
Što ćete naučiti:
- Vrste polimorfizma
- Sastaviti vrijeme polimorfizam vs. Polimorfizam vremena izvođenja
- Sastaviti vremenski polimorfizam
- Preopterećenje funkcije
- Preopterećenje operatera
- Zaključak
- Preporučena literatura
Vrste polimorfizma
Polimorfizam se dijeli na dvije vrste.
- Sastaviti vremenski polimorfizam
- Izvršni polimorfizam
Dijagram koji će to prikazati prikazan je u nastavku:
Kao što je prikazano na gornjem dijagramu, polimorfizam se dijeli na polimorfizam vremena kompajliranja i polimorfizam vremena izvođenja. Polimorfizam vremena kompajliranja dalje se dijeli na preopterećenje operatora i preopterećenje funkcije. Runtime polimorfizam se dalje provodi pomoću virtualnih funkcija.
Polimorfizam vremena kompilacije poznat je i kao rani vezni ili statički polimorfizam. U ovoj vrsti polimorfizma, metoda objekta poziva se u vrijeme sastavljanja. U slučaju polimorfizma vremena izvođenja, metoda objekta poziva se u vrijeme izvođenja.
Izvođački polimorfizam poznat je i kao dinamički ili kasni vezni ili dinamički polimorfizam. Detaljnu provedbu svake od ovih tehnika proučit ćemo u sljedećim temama.
Sastaviti vrijeme polimorfizam vs. Polimorfizam vremena izvođenja
U nastavku ćemo vidjeti glavne razlike između vremena kompajliranja i polimorfizma vremena izvođenja.
Sastaviti vremenski polimorfizam | Izvršni polimorfizam |
---|---|
Također poznat kao statički polimorfizam ili rano vezanje | Također poznat kao dinamički polimorfizam ili kasno / dinamičko vezanje |
Objects metoda poziva se u vrijeme kompajliranja | Metoda objekta poziva se u vrijeme izvođenja |
Obično se provodi pomoću preopterećenja operatora i preopterećenja funkcije | Provedeno pomoću virtualnih funkcija i nadjačavanja metoda |
Preopterećenje metode je polimorfizam vremena kompajliranja u kojem više od jedne metode može imati isti naziv, ali različite popise parametara i tipove. | Nadjačavanje metode je runtime polimorfizam gdje više od jedne metode ima isto ime s istim prototipom |
Budući da su metode poznate u vrijeme prevođenja, izvršavanje je brže | Izvršenje je sporije jer je metoda poznata u vrijeme izvođenja |
Omogućite manje fleksibilnosti za implementaciju rješenja, jer sve treba biti poznato tijekom sastavljanja | Daleko fleksibilniji za primjenu složenih rješenja jer se metode odlučuju u vrijeme izvođenja |
Sastaviti vremenski polimorfizam
Polimorfizam vremena kompiliranja tehnika je u kojoj se metoda objekta poziva u vrijeme sastavljanja.
Ova vrsta polimorfizma provodi se na dva načina.
- Preopterećenje funkcije
- Preopterećenje operatera
Detaljno ćemo razgovarati o svakoj tehnici.
Preopterećenje funkcije
Kaže se da je funkcija preopterećena kada imamo više funkcija s istim imenom, ali različitih tipova parametara ili različitim brojem argumenata.
Stoga se funkcija može preopteretiti na temelju vrsta parametara, redoslijeda parametara i broja parametara.
Imajte na umu da dvije funkcije s istim imenom i istim popisom parametara, ali različitim tipom povratka, nisu preopterećene funkcije i rezultirat će pogreškom kompilacije ako se koriste u programu.
Slično tome, kada se parametri funkcije razlikuju samo u pokazivaču i ako je vrsta polja ekvivalentna, tada se ne bi trebao koristiti za preopterećenje.
kako koristiti spavanje u c ++ - u
Ostale vrste poput statičkih i nestatičnih, const i volatile itd. Ili se deklaracije parametara koje se razlikuju u prisutnosti ili odsustvu zadanih vrijednosti također ne smiju koristiti za preopterećenje jer su ekvivalentne s gledišta implementacije.
Na primjer,sljedeći prototipi funkcija su preopterećene funkcije.
Add(int,int); Add(int,float); Add(float,int); Add(int,int,int);
U gornjim prototipovima vidimo da preopterećujemo funkciju Add na temelju vrste parametara, niza ili redoslijeda parametara, broja parametara itd.
Uzmimo cjelovit primjer programiranja da bismo bolje razumjeli preopterećenje funkcija.
#include #include using namespace std; class Summation { public: int Add(int num1,int num2) { return num1+num2; } int Add(int num1,int num2, int num3) { return num1+num2+num3; } string Add(string s1,string s2){ return s1+s2; } }; int main(void) { Summation obj; cout< Izlaz:
35
191
19
Pozdrav svijete
U gore navedenom programu imamo klasu Zbirka koja je definirala tri preopterećene funkcije pod nazivom Dodaj koja uzima dva cjelobrojna argumenta, tri cjelobrojna argumenta i dva argumenta niza.
U glavnoj funkciji izvršimo četiri poziva funkcije koji pružaju različite parametre. Prva dva poziva funkcije su jednostavna. U trećem pozivu funkcije Add dodamo dvije vrijednosti s pomičnim zarezom kao argumente.
U ovom slučaju, funkcija koja se podudara je int Dodaj (int, int) jer se interno pretvara u dvostruku, a zatim podudara s funkcijom s parametrima int. Da smo naveli double umjesto float, tada bismo imali još jednu preopterećenu funkciju s double kao parametre.
Posljednji poziv funkcije koristi vrijednosti niza kao parametre. U ovom slučaju, operater Add (+) djeluje kao operator spajanja i spaja dvije vrijednosti niza kako bi proizveo jedan niz.
Prednosti preopterećenja funkcije
Glavna prednost preopterećenja funkcije je što promovira ponovnu upotrebu koda. Možemo imati što više funkcija s istim imenom sve dok su preopterećene na temelju vrste argumenta, niza argumenata i broja argumenata.
Na taj način postaje lakše imati različite funkcije s istim imenom koje predstavljaju ponašanje iste operacije u različitim uvjetima.
Da nije bilo preopterećenja funkcije, tada bismo morali napisati previše različitih vrsta funkcija s različitim imenima, čineći tako kôd nečitkim i teškim za prilagodbu.
Preopterećenje operatera
Preopterećenje operatora tehnika je kojom postojećim operatorima u C ++ pridajemo drugačije značenje. Drugim riječima, preopterećujemo operatore da bismo dali posebno značenje korisnički definiranim vrstama podataka kao objektima.
Većina operatora u C ++-u preopterećena je ili im se daje posebno značenje kako bi mogli raditi na korisnički definiranim vrstama podataka. Imajte na umu da se tijekom preopterećenja osnovni rad operatora ne mijenja. Preopterećenje samo daje operatoru dodatno značenje zadržavajući njihovu osnovnu semantiku istom.
Iako se većina operatora može preopteretiti u C ++-u, postoje neki operatori koji se ne mogu preopteretiti.
Ti su operateri navedeni u donjoj tablici.
Operateri Operator razlučivosti opsega (: :) Veličina izbor člana (.) birač pokazivača člana (*) ternarni operator (? :)
Funkcije koje koristimo za preopterećenje operatora nazivaju se „ Funkcije operatora '.
Funkcije operatora slične su normalnim funkcijama, ali s razlikom. Razlika je u tome što naziv operatora započinje ključnom riječi „ operater ”Nakon čega slijedi simbol operatora koji treba preopteretiti.
Funkcija operatora tada se poziva kada se odgovarajući operator koristi u programu. Te funkcije operatora mogu biti funkcije člana ili globalne metode ili čak funkcija prijatelja.
Opća sintaksa funkcije operatora je:
return_type classname::operator op(parameter list) { //function body }
Ovdje je “operator op” funkcija operatora gdje je operator ključna riječ, a op operater koji treba preopteretiti. Return_type je vrsta vrijednosti koju treba vratiti.
Pogledajmo nekoliko primjera programiranja kako bismo demonstrirali preopterećenje operatora pomoću operaterskih funkcija.
Primjer 1:Preopterećenje unarnog operatora pomoću funkcije operatora člana.
#include using namespace std; class Distance { public: int feet; // Constructor to initialize the object's value Distance(int feet) { this->feet = feet; } //operator function to overload ++ operator to perform increment on Distance obj void operator++() { feet++; } void print(){ cout << '
Incremented Feet value: ' << feet; } }; int main() { Distance d1(9); // Use (++) unary operator ++d1; d1.print(); return 0; }
Izlaz:
Povećana vrijednost stopala: 10
Ovdje smo preopteretili unarni operator prirasta koristeći funkciju operator ++. U glavnoj funkciji koristimo ovaj ++ operator da bismo povećali objekt klase Udaljenost.
Primjer 2:Preopterećenje binarnog operatora pomoću funkcije operatora člana.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //Operator function to overload binary + to add two complex numbers Complex operator + (Complex const &obj) { Complex c3; c3.real = real + obj.real; c3.imag = imag + obj.imag; return c3; } void print() { cout << real << ' + i' << imag << endl; } }; int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Izlaz:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Ovdje smo upotrijebili klasični primjer zbrajanja dva složena broja pomoću preopterećenja operatora. Definiramo klasu koja predstavlja kompleksne brojeve i funkciju operatora za preopterećenje + operator u kojoj dodajemo stvarne i imaginarne dijelove složenih brojeva.
U glavnoj funkciji deklariramo dva složena objekta i dodajemo ih pomoću preopterećenog + operatora da bismo dobili željeni rezultat.
U donjem primjeru koristit ćemo funkciju prijatelja kako bismo dodali dva složena broja kako bismo vidjeli razliku u implementaciji.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //friend function to overload binary + to add two complex numbers friend Complex operator +(Complex const &, Complex const &); void print() { cout << real << ' + i' << imag << endl; } }; Complex operator + (Complex const &c1, Complex const &c2) { Complex c3; c3.real = c1.real + c2.real; c3.imag = c1.imag + c2.imag; return c3; } int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Izlaz:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Vidimo da je rezultat programa isti. Jedina razlika u implementaciji je upotreba funkcije prijatelja za preopterećenje operatora + umjesto funkcije člana u prethodnoj implementaciji.
internet stvari koje tvrtke mogu gledati
Kada se za binarni operator koristi funkcija prijatelja, moramo izričito navesti oba operanda funkcije. Slično tome, kada je unarni operator preopterećen pomoću funkcije prijatelja, funkciji moramo pružiti jedan operand.
Osim funkcija operatora, možemo napisati i operator pretvorbe koja se koristi za pretvaranje iz jedne vrste u drugu. Ovi preopterećeni operatori pretvorbe trebali bi biti funkcija člana klase.
Primjer 3:Preopterećenje operatora pomoću operatora pretvorbe.
#include using namespace std; class DecFraction { int numerator, denom; public: DecFraction(int num, int denm) { numerator = num; denom = denm; } // conversion operator: converts fraction to float value and returns it operator float() const { return float(numerator) / float(denom); } }; int main() { DecFraction df(3, 5); //object of class float res_val = df; //calls conversion operator cout << 'The resultant value of given fraction (3,5)= '< Izlaz:
Rezultirajuća vrijednost dane frakcije (3,5) = 0,6
U ovom smo programu koristili operator pretvorbe za pretvaranje datog razlomka u plutajuću vrijednost. Jednom kada je pretvorba izvršena, operator pretvorbe vraća rezultantnu vrijednost pozivatelju.
U glavnoj funkciji, kada df objekt dodijelimo varijabli res_val, dolazi do pretvorbe i rezultat se pohranjuje u res_val.
Konstruktor možemo nazvati i s jednim argumentom. Kada možemo pozvati konstruktor iz klase pomoću jednog argumenta, to se naziva „ pretvorba graditelj '. Konstruktor pretvorbe može se koristiti za implicitnu pretvorbu u klasu koja se gradi.
#include using namespace std; class Point { private: int x,y; public: Point(int i=0,int j=0) {x = i;y=j;} void print() { cout<<' x = '< Izlaz:
Točka konstruirana pomoću normalnog konstruktora
x = 20 y = 30
Točka konstruirana pomoću konstruktora pretvorbe
x = 10 y = 0
Ovdje imamo klasu Point koja definira konstruktor sa zadanim vrijednostima. U glavnoj funkciji konstruiramo objekt pt s koordinatama x i y. Dalje, pt samo dodijelimo vrijednost 10. Tu se poziva konstruktor pretvorbe i x dodjeljuje vrijednost 10 dok je y zadana vrijednost 0.
Pravila preopterećenja operatera
Tijekom izvođenja operativnog preopterećenja moramo paziti na pravila u nastavku.
- U C ++-u smo u mogućnosti preopteretiti samo postojeće operatore. Novo dodani operatori ne mogu se preopteretiti.
- Kada su operatori preopterećeni, moramo osigurati da je barem jedan od operanda korisnički definiran tip.
- Da bismo preopteretili određene operatore, možemo koristiti i funkciju prijatelja.
- Kada preopteretimo unarne operatore pomoću funkcije člana, to ne uzima nikakve eksplicitne argumente. Potreban je jedan eksplicitan argument kada je unarni operator preopterećen pomoću funkcije prijatelja.
- Slično tome, kada su binarni operatori preopterećeni pomoću funkcije člana, funkciji moramo pružiti jedan eksplicitan argument. Kada su binarni operatori preopterećeni pomoću funkcije prijatelja, funkcija uzima dva argumenta.
- U C ++-u postoje dva operatora koja su već preopterećena. To su '=' i '&'. Stoga da bismo kopirali objekt iste klase, ne trebamo preopteretiti operator =, a možemo ga koristiti izravno.
Prednosti preopterećenja operatera
Preopterećenje operatora u C ++-u omogućuje nam da proširimo funkcionalnost operatora na korisnički definirane tipove, uključujući objekte klase uz ugrađene tipove.
Proširujući funkcionalnost operatora na korisnički definirane tipove, ne trebamo pisati složeni kod za obavljanje različitih operacija na korisnički definiranim tipovima, ali to možemo učiniti u samoj operaciji, baš kao i ugrađeni tipovi.
Zaključak
Polimorfizam vremena kompajliranja pruža mogućnost preopterećenja uglavnom za proširenje funkcionalnosti koda u smislu preopterećenja funkcija i preopterećenja operatora.
Preopterećenjem funkcije možemo napisati više funkcija s istim imenom, ali različitim parametrima i vrstama. To kôd čini jednostavnim i lako čitljivim. Preopterećenjem operatora možemo proširiti funkcionalnost operatora, tako da možemo obavljati osnovne operacije i na korisnički definiranim vrstama.
U našem nadolazećem tutorialu naučit ćemo više o polimorfizmu izvođenja u C ++.
=> Pročitajte jednostavnu seriju C ++ treninga.
Preporučena literatura
- Runtime polimorfizam u C ++
- Funkcije prijatelja u C ++
- Rekurzija u C ++
- Vodič za glavne funkcije Pythona s praktičnim primjerima
- Cjelovit pregled C ++-a
- QTP vodič # 21 - Kako napraviti QTP testove modularnim i višekratnim korištenjem knjižnica radnji i funkcija
- Vodič za Unix cijevi: Cijevi u Unix programiranju
- Knjižnične funkcije na C ++