Kaj je polimorfizem v jeziku C ++?
V jeziku C ++ polimorfizem povzroči, da se funkcija člana obnaša drugače glede na objekt, ki jo pokliče / prikliče. Polimorfizem je grška beseda, ki pomeni imeti številne oblike. Pojavi se, ko imate hierarhijo razredov, povezanih z dedovanjem.
Denimo, da imamo funkcijo makeSound (). Ko mačka pokliče to funkcijo, bo ustvarila mijav zvok. Ko krava prikliče isto funkcijo, bo oddala moow zvok.
Čeprav imamo eno funkcijo, se v različnih okoliščinah obnaša drugače. Funkcija ima več oblik; zato smo dosegli polimorfizem.
V tej vadnici C ++ boste izvedeli:
- Kaj je polimorfizem?
- Vrste polimorfizma
- Prevedite polimorfizem časa
- Preobremenitev funkcije
- Preobremenitev operaterja
- Polimorfizem med izvajanjem
- Preglasitev funkcije
- Navidezna funkcija C ++
- Čas polimorfizma prevajanja vs. Polimorfizem med izvajanjem
Vrste polimorfizma
C ++ podpira dve vrsti polimorfizma:
- Prevzemni polimorfizem in
- Polimorfizem med izvajanjem.
Prevedite polimorfizem časa
Preobremenjene funkcije prikličete z ujemanjem števila in vrste argumentov. Informacije so prisotne v času prevajanja. To pomeni, da bo prevajalnik C ++ izbral pravo funkcijo v času prevajanja.
Polimorfizem v času prevajanja je dosežen s preobremenitvijo funkcij in preobremenitvijo operaterja.
Preobremenitev funkcije
Preobremenitev funkcije se zgodi, če imamo veliko funkcij s podobnimi imeni, vendar z različnimi argumenti. Argumenti se lahko razlikujejo glede na število ali vrsto.
Primer 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;}
Izhod:
Tu je posnetek zaslona kode:
Razlaga kode:
- V našo kodo vključite datoteko glave iostream. Uporabili bomo lahko njegove funkcije.
- V našo kodo vključite imenski prostor std. Njegove razrede bomo lahko uporabljali, ne da bi ga poklicali.
- Ustvarite funkcijo z imenom test, ki sprejme celoštevilčni parameter i. Znak {označuje začetek preizkusa telesa funkcije.
- Izjava, ki se izvede, če je poklican / poklican zgornji preizkus funkcije.
- Konec telesa zgornjega preizkusa funkcije.
- Ustvarite funkcijo z imenom test, ki sprejme float parameter f. Znak {označuje začetek preizkusa telesa funkcije.
- Izjava, ki se izvede, če je poklican / poklican zgornji preizkus funkcije.
- Konec telesa zgornjega preskusa funkcije.
- Ustvarite funkcijo z imenom test, ki sprejme parameter znaka ch. Znak {označuje začetek preizkusa telesa funkcije.
- Izjava, ki se izvede, če je poklican / poklican zgornji preizkus funkcije.
- Konec telesa zgornjega preskusa funkcije.
- Pokličite glavno funkcijo. Znak {označuje začetek telesa funkcije.
- Pokličite test funkcije in mu kot vrednost argumenta posredujte 5. To prikliče testno funkcijo, ki sprejme celoštevilčni argument, to je prvo testno funkcijo.
- Pokličite test funkcije in mu kot vrednost argumenta posredujte 5.5. To bo sprožilo testno funkcijo, ki sprejme argument float, to je drugo testno funkcijo.
- Pokličite test funkcije in mu kot vrednost argumenta posredujte pet. To bo sprožilo testno funkcijo, ki sprejme argument znaka, to je tretjo testno funkcijo.
- Če se program uspešno izvaja, mora vrniti vrednost.
- Konec telesa glavne () funkcije.
Imamo tri funkcije z istim imenom, vendar različne vrste argumentov. Dosegli smo polimorfizem.
Preobremenitev operaterja
V operaterju Overloading določimo nov pomen za operaterja C ++. Spremeni se tudi način delovanja operaterja. Na primer, lahko definiramo operator +, ki združuje dva niza. Poznamo ga kot operater seštevanja za dodajanje številskih vrednosti. Po naši definiciji jih bo dodala med cela števila. Ko jih postavite med nize, jih bo združil.
2. primer:
#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();}
Izhod:
Tu je posnetek zaslona kode:
Razlaga kode:
- V naš program vključite glavo datoteke iostream, da boste lahko uporabljali njegove funkcije.
- V naš program vključite imenski prostor std, da lahko uporabljate njegove razrede, ne da bi ga poklicali.
- Ustvarite razred z imenom ComplexNum. {Označuje začetek telesa predavanja.
- S spremeniteljem zasebnega dostopa označite spremenljivke kot zasebne, kar pomeni, da je do njih mogoče dostopati samo znotraj razreda.
- Določite dve celoštevilčni spremenljivki, realno in več.
- Uporabite modifikator javnega dostopa, da konstruktor označite kot javni, kar pomeni, da bo dostopen tudi zunaj razreda.
- Ustvarite konstruktor razreda in inicializirajte spremenljivke.
- Inicializirajte vrednost spremenljivke real.
- Inicializirajte vrednost spremenljivke nad.
- Konec telesa konstruktorja.
- Preglasiti moramo pomen operatorja +.
- Ustvarite rezultat podatkovnega tipa za vrsto ComplexNum.
- Uporabite operator + s kompleksnimi številkami. Ta vrstica bo dodala pravi del številke stvarnemu delu druge številke.
- Uporabite operator + s kompleksnimi številkami. Ta vrstica bo namišljeni del števila dodala namišljenemu delu drugega števila.
- Program bo vrnil vrednost spremenljivke rezultat po uspešni izvedbi.
- Konec definicije novega pomena operatorja +, to je preobremenitve.
- Pokličite metodo print ().
- Po dodajanju na konzolo natisnite novo kompleksno številko.
- Konec funkcije telesa tiskanja ().
- Konec telesa razreda ComplexNum.
- Pokličite glavno funkcijo.
- Podajte vrednosti realnih in kompleksnih delov, ki jih želite dodati. Prvi del c1 bo dodan prvemu delu c2, to je 10 + 3. Drugi del c1 bo dodan drugemu delu c, to je 2 + 7.
- Izvedite operacijo z uporabo preobremenjenega operatorja + in rezultat shranite v spremenljivko c3.
- Na konzolo natisnite vrednost spremenljivke c3.
- Konec telesa glavne () funkcije.
Polimorfizem med izvajanjem
To se zgodi, ko se metoda objekta prikliče / pokliče med izvajanjem in ne med časom prevajanja. Polimorfizem med izvajanjem se doseže s preglasitvijo funkcije. Funkcija, ki jo je treba poklicati / poklicati, se vzpostavi med izvajanjem.
Preglasitev funkcije
Preglasitev funkcije se zgodi, ko funkcija osnovnega razreda dobi novo definicijo v izpeljanem razredu. Takrat lahko rečemo, da je bila osnovna funkcija razveljavljena.
Na primer:
#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;}
Izhod:
Tu je posnetek zaslona kode:
Razlaga kode:
- Uvozite datoteko glave iostream v naš program in uporabite njene funkcije.
- V naš program vključite imenski prostor std, da lahko uporabljate njegove razrede, ne da bi ga poklicali.
- Ustvarite razred z imenom Sesalci. {Označuje začetek telesa predavanja.
- Z modifikatorjem javnega dostopa nastavite funkcijo, ki jo bomo ustvarili, kot javno dostopno. Dostopna bo zunaj tega razreda.
- Ustvarite javno funkcijo z imenom eat. Znak {označuje začetek telesa funkcije.
- Natisnite stavek, dodan funkciji cout, ko je priklicana funkcija eat ().
- Konec telesa funkcije jesti ().
- Konec telesa razreda Sesalci.
- Ustvarite razred z imenom Krava, ki podeduje razred Sesalci. Krava je izpeljani razred, medtem ko je sesalec osnovni razred. {Označuje začetek tega predavanja.
- Z modifikatorjem javnega dostopa označite funkcijo, ki jo bomo ustvarili, kot javno dostopno. Dostopna bo zunaj tega razreda.
- Preglasite funkcijo eat (), ki je bila definirana v osnovnem razredu. Znak {označuje začetek telesa funkcije.
- Stavek za tiskanje na ukazni mizi, ko se prikliče ta funkcija.
- Konec telesa funkcije eat ().
- Konec trupa razreda Krava.
- Pokličite glavno funkcijo. Znak {označuje začetek telesa te funkcije.
- Ustvarite primerek razreda Cow in mu dajte ime c.
- Pokličite funkcijo eat (), določeno v razredu Cow.
- Program mora po uspešnem zaključku vrniti vrednost.
- Konec glavne () funkcije.
Navidezna funkcija C ++
Navidezna funkcija je še en način za izvajanje polimorfizma med izvajanjem v jeziku C ++. To je posebna funkcija, definirana v osnovnem razredu in ponovno opredeljena v izpeljanem razredu. Če želite razglasiti navidezno funkcijo, uporabite navidezno ključno besedo. Ključna beseda mora biti pred izjavo funkcije v osnovnem razredu.
Če je razred navidezne funkcije podedovan, navidezni razred na novo definira navidezno funkcijo glede na njene potrebe. Na primer:
#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();}
Izhod:
Tu je posnetek zaslona kode:
Razlaga kode:
- V kodo vključite glavo datoteke iostream, da boste lahko uporabljali njene funkcije.
- V našo kodo vključite imenski prostor std, da lahko uporabljate njegove razrede, ne da bi ga poklicali.
- Ustvarite razred z imenom ClassA.
- Z modifikatorjem javnega dostopa označite člana predavanja kot javno dostopen.
- Ustvarite navidezno funkcijo z imenom show (). To bo javna funkcija.
- Besedilo, ki se natisne, ko se prikliče show (). Endl je ključna beseda C ++, kar pomeni končno vrstico. Kazalec miške premakne v naslednjo vrstico.
- Konec telesa navidezne funkcije show ().
- Konec telesa razreda A.
- Ustvarjanje novega razreda z imenom ClassB, ki podeduje razred ClassA. ClassA postane osnovni razred, medtem ko ClassB postane izpeljani razred.
- Z modifikatorjem javnega dostopa označite člana predavanja kot javno dostopen.
- Ponovno določite navidezno funkcijo show (), izpeljano v osnovnem razredu.
- Besedilo za tiskanje na konzoli, ko se prikliče funkcija show (), definirana v izpeljanem razredu.
- Konec telesa funkcije show ().
- Konec telesa izpeljanega razreda, ClassB.
- Pokličite glavno funkcijo. Programsko logiko je treba dodati v njeno telo.
- Ustvarite kazalec spremenljivke z imenom. Kaže na razred z imenom ClassA.
- Ustvarite primerek razreda z imenom ClassB. Primerek dobi ime b.
- V spremenljivki a dodelite shrambe vrednosti na naslovu b.
- Prikličite funkcijo show (), definirano v izpeljanem razredu. Izvedena je bila pozna vezava.
- Konec telesa glavne () funkcije.
Čas polimorfizma prevajanja vs. Polimorfizem med izvajanjem
Tu so glavne razlike med obema:
Prekomorni polimorfizem | Polimorfizem med izvajanjem |
Imenuje se tudi zgodnja vezava ali statični polimorfizem | Imenuje se tudi pozna / dinamična vezava ali dinamični polimorfizem |
Metoda se pokliče / prikliče v času prevajanja | Metoda se pokliče / prikliče med izvajanjem |
Izvedeno s preobremenitvijo funkcije in preobremenitvijo operaterja | Izvedeno s preglasitvijo metode in navideznimi funkcijami |
Primer, preobremenitev metode. Mnoge metode imajo lahko podobna imena, vendar različno število ali vrste argumentov | Primer, preglasitev metode. Številne metode imajo lahko podobno ime in isti prototip. |
Hitrejše izvajanje, saj se odkrivanje metod izvaja v času prevajanja | Počasnejše izvajanje, ker se odkrivalec metod izvaja med izvajanjem. |
Za reševanje problemov je na voljo manj prilagodljivosti, saj je v času prevajanja vse znano. | Za reševanje zapletenih problemov je na voljo veliko prilagodljivosti, saj metode odkrivamo med izvajanjem. |
Povzetek:
- Polimorfizem pomeni imeti več oblik.
- Pojavi se, ko obstaja hierarhija razredov, povezanih z dedovanjem.
- S polimorfizmom se lahko funkcija obnaša drugače glede na objekt, ki ga prikliče / pokliče.
- V polimorfizmu časa prevajanja se funkcija, ki jo je treba priklicati, vzpostavi v času prevajanja.
- V polimorfizmu med izvajanjem se funkcija, ki jo je treba priklicati, vzpostavi med izvajanjem.
- Polimorfizem v času prevajanja se določi s preobremenitvijo funkcije in preobremenitvijo operaterja.
- Pri preobremenitvi funkcij obstaja veliko funkcij s podobnimi imeni, vendar z različnimi argumenti.
- Parametri se lahko razlikujejo po številu ali tipu.
- Pri preobremenitvi operaterja je za operaterje C ++ opredeljen nov pomen.
- Polimorfizem med izvajanjem se doseže s preglasitvijo funkcije.
- Pri razveljavitvi funkcije daje izvedeni razred novo definicijo funkciji, definirani v osnovnem razredu.