polymorphism c
Vloga polimorfizma v jeziku C ++ s primeri.
Polimorfizem je eden od štirih stebrov objektno usmerjenega programiranja. Polimorfizem pomeni imeti več oblik. Lahko ga opredelimo kot tehniko, s katero ima predmet lahko različne oblike, odvisno od situacije.
V programskem smislu lahko rečemo, da se lahko objekt v različnih pogojih obnaša drugače.
V tej vadnici bomo podrobno spoznali vrste polimorfizma, načine za izvajanje polimorfizma in različne druge koncepte polimorfizma.
=> Tukaj si oglejte A-Z o vajah za usposabljanje za C ++.
Na primer, ženska ima lahko različne vloge v različnih situacijah. Otroku je mati, doma gospodinja, delavka v pisarni itd. Ženska torej zavzema različne vloge in izkazuje drugačno vedenje v različnih pogojih. To je resnični primer polimorfizma.
Podobno tudi v programskem svetu imamo lahko operator '+', ki je binarni seštevalni operator, ki se ob spremembi operandov obnaša drugače. Na primer, ko sta oba operanda številčna, izvede seštevanje.
Po drugi strani pa, ko so operandi nizovni, deluje kot operater združevanja. Polimorfizem torej na kratko pomeni entiteto, ki ima različne oblike ali se obnaša drugače v različnih pogojih.
Kaj se boste naučili:
- Vrste polimorfizma
- Compile Time Polimorfizem vs. Polimorfizem med izvajanjem
- Prevedite polimorfizem časa
- Preobremenitev funkcije
- Preobremenitev operaterja
- Zaključek
- Priporočeno branje
Vrste polimorfizma
Polimorfizem je razdeljen na dve vrsti.
- Prevedite polimorfizem časa
- Polimorfizem med izvajanjem
Diagram, ki to predstavlja, je prikazan spodaj:
Kot je prikazano na zgornjem diagramu, je polimorfizem razdeljen na polimorfizem v času prevajanja in polimorfizem med izvajanjem. Časovni polimorfizem prevajanja je nadalje razdeljen na preobremenitev operaterja in preobremenitev funkcije. Polimorfizem med izvajanjem se nadalje izvaja z uporabo navideznih funkcij.
Čas polimorfizma prevajanja je znan tudi kot zgodnji vezni ali statični polimorfizem. Pri tej vrsti polimorfizma se objektna metoda prikliče v času prevajanja. V primeru polimorfizma med izvajanjem se metoda predmeta pokliče v času izvajanja.
Polimorfizem med izvajanjem je znan tudi kot dinamični ali pozno vezavni ali dinamični polimorfizem. Podrobno izvajanje vsake od teh tehnik bomo preučili v naslednjih temah.
Compile Time Polimorfizem vs. Polimorfizem med izvajanjem
Poglejmo glavne razlike med časom prevajanja in polimorfizmom med izvajanjem spodaj.
Prevedite polimorfizem časa | Polimorfizem med izvajanjem |
---|---|
Znan tudi kot statični polimorfizem ali zgodnja vezava | Znan tudi kot dinamični polimorfizem ali pozno / dinamična vezava |
Objects metoda se prikliče v času prevajanja | Metoda predmeta se prikliče med izvajanjem |
Običajno se izvaja z uporabo preobremenitve operaterja in preobremenitve funkcije | Izvedeno z uporabo navideznih funkcij in preglasitve metode |
Preobremenitev metode je polimorfizem časa prevajanja, pri katerem ima lahko več metod isto ime, vendar različne sezname parametrov in vrste. | Preglasitev metode je polimorfizem med izvajanjem, kjer ima več metod enako ime z istim prototipom |
Ker so metode v času prevajanja znane, je izvajanje hitrejše | Izvajanje je počasnejše, saj je metoda znana med izvajanjem |
Zagotovite manj prilagodljivosti za izvajanje rešitev, saj je treba v času prevajanja vedeti vse | Veliko bolj prilagodljivi za izvajanje kompleksnih rešitev, saj se metode odločajo med izvajanjem |
Prevedite polimorfizem časa
Polimorfizem časa prevajanja je tehnika, pri kateri se v času prevajanja prikliče metoda predmeta.
Ta vrsta polimorfizma se izvaja na dva načina.
vprašanje in odgovor na intervju za preskušanje programske opreme
- Preobremenitev funkcije
- Preobremenitev operaterja
Podrobno bomo razpravljali o vsaki tehniki.
Preobremenitev funkcije
Funkcija naj bi bila preobremenjena, če imamo več funkcij z istim imenom, vendar z različnimi vrstami parametrov ali različnim številom argumentov.
Tako je mogoče funkcijo preobremeniti glede na vrste parametrov, vrstni red parametrov in število parametrov.
Upoštevajte, da dve funkciji z istim imenom in istim seznamom parametrov, vendar različnim tipom vrnitve, ni preobremenjena funkcija in bo povzročila napako pri prevajanju, če se uporablja v programu.
Podobno, kadar se funkcijski parametri razlikujejo samo po kazalcu in če je vrsta matrike enakovredna, se je ne sme uporabljati za preobremenitev.
Druge vrste, kot so statične in nestatične, const in volatile itd. Ali pa se izjave parametrov, ki se razlikujejo po prisotnosti ali odsotnosti privzetih vrednosti, prav tako ne smejo uporabljati za preobremenitev, saj so enakovredne z vidika izvedbe.
Na primer,naslednji prototipi funkcij so preobremenjene funkcije.
Add(int,int); Add(int,float); Add(float,int); Add(int,int,int);
V zgornjih prototipih vidimo, da preobremenimo funkcijo Add glede na vrsto parametrov, zaporedje ali vrstni red parametrov, število parametrov itd.
Vzemimo celoten primer programiranja, da bomo bolje razumeli preobremenitev funkcij.
#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< Izhod:
35
191
19.
Pozdravljen, svet
V zgornjem programu imamo razred Summacija, ki je definiral tri preobremenjene funkcije z imenom Add, ki zajema dva celoštevilčna argumenta, tri celoštevilčne argumente in dva argumenta niza.
V glavni funkciji opravimo štiri klice funkcij, ki zagotavljajo različne parametre. Prva dva klica funkcij sta enostavna. V tretjem klicu funkcije Add dodamo dve vrednosti s plavajočo vejico kot argumenta.
V tem primeru je funkcija, ki se ujema, int Add (int, int), saj se interno pretvori v dvojno in nato ujema s funkcijo s parametri int. Če bi namesto float določili double, bi imeli še eno preobremenjeno funkcijo z double kot parametri.
Zadnji funkcijski klic kot parametre uporablja vrednosti nizov. V tem primeru operater Add (+) deluje kot operater združevanja in združi vrednosti dveh nizov, da ustvari en sam niz.
Prednosti preobremenitve funkcije
Glavna prednost preobremenitve funkcije je, da spodbuja ponovno uporabo kode. Lahko imamo čim več funkcij z istim imenom, če so preobremenjene glede na vrsto argumenta, zaporedje argumentov in število argumentov.
S tem postane lažje imeti različne funkcije z istim imenom, ki predstavljajo obnašanje iste operacije v različnih pogojih.
Če ne bi bilo preobremenitve funkcij, bi morali napisati preveč različnih vrst funkcij z različnimi imeni, zaradi česar bi bila koda neberljiva in težko prilagodljiva.
Preobremenitev operaterja
Preobremenitev operaterja je tehnika, s katero obstoječim operaterjem v C ++ damo drugačen pomen. Z drugimi besedami, operaterje preobremenimo, da uporabniško določenim podatkovnim vrstam dajo poseben pomen kot predmeti.
Večina operaterjev v jeziku C ++ je preobremenjena ali jim je dodeljen poseben pomen, da lahko delajo na uporabniško določenih tipih podatkov. Upoštevajte, da med preobremenitvijo osnovna operacija operaterjev ni spremenjena. Preobremenitev daje operaterju dodaten pomen, saj ohranja njihovo osnovno semantiko enako.
Čeprav je večino operaterjev v sistemu C ++ mogoče preobremeniti, pa nekaterih operaterjev ni mogoče preobremeniti.
Ti operaterji so navedeni v spodnji tabeli.
Operaterji Operater ločljivosti obsega (: :) Velikost izbirnik člana (.) izbirnik kazalca člana (*) ternarni operater (? :)
Funkcije, ki jih uporabljamo za preobremenitev operaterjev, se imenujejo » Funkcije operaterja '.
Funkcije operaterja so podobne običajnim funkcijam, vendar z razliko. Razlika je v tem, da se ime funkcij operaterja začne s ključno besedo “ operater ”, Ki mu sledi simbol operaterja, ki naj bi bil preobremenjen.
Operacijska funkcija se nato pokliče, ko se v programu uporablja ustrezni operater. Te funkcije operaterja so lahko članske funkcije ali globalne metode ali celo prijateljska funkcija.
Splošna sintaksa operatorjske funkcije je:
return_type classname::operator op(parameter list) { //function body }
Tu je 'operator op' operacijska funkcija, kjer je operator ključna beseda, op pa operater, ki ga je treba preobremeniti. Return_type je vrsta vrednosti, ki jo je treba vrniti.
Oglejmo si nekaj primerov programiranja, ki dokazujejo preobremenitev operaterja z uporabo funkcij operaterja.
Primer 1:Preobremenitev unarnega operaterja s funkcijo člana operatorja.
#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; }
Izhod:
Povečana vrednost stopal: 10
Tu smo preobremenili unarni operator prirastka s pomočjo funkcije operator ++. V glavni funkciji uporabljamo ta operater ++ za povečanje predmeta razreda Distance.
2. primer:Preobremenitev binarnega operaterja s funkcijo člana operator.
#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(); }
Izhod:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Tu smo uporabili klasičen primer dodajanja dveh kompleksnih števil s pomočjo preobremenitve operaterja. Določimo razred, ki predstavlja Kompleksna števila, in operatorjsko funkcijo za preobremenitev + operator, v kateri dodamo resnične in namišljene dele kompleksnih števil.
kako si ogledati datoteke .swf
V glavni funkciji razglasimo dva zapletena predmeta in ju z uporabo preobremenjenega + operatorja dodamo, da dobimo želeni rezultat.
V spodnjem primeru bomo s funkcijo prijatelja dodali dve kompleksni številki, da bomo videli razliko v izvedbi.
#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(); }
Izhod:
c1 = 2 + i5
c2 = 3 + i7
c3 = c1 + c2 = 5 + i12
Ugotavljamo, da je rezultat programa enak. Edina razlika pri izvedbi je uporaba funkcije prijatelja za preobremenitev operaterja + namesto funkcije člana v prejšnji izvedbi.
Ko se za binarni operator uporablja funkcija prijatelja, moramo funkciji izrecno navesti oba operanda. Podobno, ko je unarni operater preobremenjen s funkcijo prijatelja, moramo funkciji zagotoviti en sam operand.
Poleg funkcij operaterja lahko zapišemo tudi pretvornik ki se uporablja za pretvorbo iz ene vrste v drugo. Ti preobremenjeni pretvorniški pretvorniki bi morali biti funkcija člana razreda.
3. primer:Preobremenitev operaterja z uporabo pretvorniškega operaterja.
#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)= '< Izhod:
Nastala vrednost dane frakcije (3,5) = 0,6
V tem programu smo z pretvornikom pretvorili dano frakcijo v float vrednost. Ko je pretvorba končana, pretvornik vrne klicatelju nastalo vrednost.
Ko v glavni funkciji df objekt damo spremenljivki res_val, pride do pretvorbe in rezultat se shrani v res_val.
Konstruktor lahko pokličemo tudi z enim samim argumentom. Ko lahko z enim argumentom pokličemo konstruktor iz razreda, se to imenuje ' pretvorba gradbenik '. Konstruktor pretvorbe lahko uporabimo za implicitno pretvorbo v razred, ki ga gradimo.
#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 = '< Izhod:
Točka, zgrajena z običajnim konstruktorjem
x = 20 y = 30
Točka, izdelana s pomočjo pretvorniškega konstruktorja
x = 10 y = 0
Tu imamo razred Point, ki definira konstruktor s privzetimi vrednostmi. V glavni funkciji sestavimo objekt pt s koordinatama x in y. Nato dodamo pt samo vrednost 10. Tu se pokliče konstruktor pretvorbe in x dobi vrednost 10, medtem ko y dobi privzeto vrednost 0.
Pravila preobremenitve operaterja
Med izvajanjem preobremenitve operaterja moramo paziti na spodnja pravila.
- V C ++ lahko preobremenimo samo obstoječe operaterje. Novo dodanih operaterjev ni mogoče preobremeniti.
- Ko so operaterji preobremenjeni, moramo zagotoviti, da je vsaj eden od operandov uporabniško določen tip.
- Za preobremenitev nekaterih operaterjev lahko uporabimo tudi funkcijo prijatelja.
- Ko s pomočjo funkcije člana preobremenimo enolične operaterje, to ne vzame nobenih eksplicitnih argumentov. Potrebuje en izrecni argument, ko je unary operator preobremenjen s funkcijo prijatelja.
- Podobno, ko so binarni operaterji preobremenjeni s funkcijo člana, moramo funkciji zagotoviti en izrecni argument. Ko so binarni operaterji preobremenjeni s funkcijo prijatelja, funkcija zavzame dva argumenta.
- V C ++ sta dva operaterja, ki sta že preobremenjena. To sta '=' in '&'. Zato za kopiranje predmeta istega razreda ni treba preobremeniti operatorja = in ga lahko uporabimo neposredno.
Prednosti preobremenitve operaterja
Preobremenjenost operaterjev v C ++ nam omogoča, da razširimo funkcionalnost operaterjev na uporabniško določene tipe, vključno z objekti razredov poleg vgrajenih tipov.
Če razširimo funkcionalnost operaterja na uporabniško določene tipe, nam ni treba pisati zapletene kode za izvajanje različnih operacij na uporabniško določenih tipih, lahko pa to storimo v eni sami operaciji, tako kot vgrajeni tipi.
Zaključek
Čas polimorfizma prevajanja omogoča preobremenitev, predvsem za razširitev funkcionalnosti kode v smislu preobremenitve funkcij in preobremenitve operaterja.
S preobremenitvijo funkcije lahko zapišemo več funkcij z istim imenom, vendar z različnimi parametri in vrstami. Zaradi tega je koda enostavna in lahko berljiva. S preobremenitvijo operaterja lahko razširimo funkcionalnost operaterjev, tako da lahko izvajamo osnovne operacije tudi na uporabniško določenih vrstah.
V naši prihajajoči vadnici bomo izvedeli več o polimorfizmu izvajanja v jeziku C ++.
=> Preberite serijo Easy C ++ Training Series.
Priporočeno branje
- Polimorfizem med izvajanjem v jeziku C ++
- Prijateljske funkcije v C ++
- Rekurzija v C ++
- Vadnica za glavne funkcije Pythona s praktičnimi primeri
- Popoln pregled C ++
- Vadnica QTP # 21 - Kako narediti teste QTP modularne in za večkratno uporabo z uporabo knjižnic dejanj in funkcij
- Vadnica za cevi Unix: Cevi v programiranju Unix
- Knjižnične funkcije v jeziku C ++