Sana polymorfismi tarkoittaa monia muotoja. Yksinkertaisesti sanottuna voimme määritellä polymorfismin viestin kyvyksi näyttää useammassa kuin yhdessä muodossa. Tosielämän esimerkki polymorfismista on henkilö, jolla voi samanaikaisesti olla erilaisia ominaisuuksia. Mies on samanaikaisesti isä, aviomies ja työntekijä. Joten sama henkilö käyttäytyy eri tavalla eri tilanteissa. Tätä kutsutaan polymorfismiksi. Polymorfismia pidetään yhtenä olio-ohjelmoinnin tärkeistä piirteistä.
Polymorfismin tyypit
- Käännösajan polymorfismi
- Ajonaikainen polymorfismi

Polymorfismin tyypit
1. Käännösajan polymorfismi
Tämän tyyppinen polymorfismi saavutetaan toimintojen ylikuormituksella tai operaattorin ylikuormituksella.
A. Toimintojen ylikuormitus
Kun on useita funktioita, joilla on sama nimi, mutta eri parametrit, funktioiden sanotaan olevan ylikuormitettu, tästä syystä tämä tunnetaan nimellä Function Overloading. Toiminnot voivat ylikuormittua muuttaa argumenttien määrää tai/ja argumenttien tyypin muuttaminen . Yksinkertaisesti sanottuna se on olio-ohjelmoinnin ominaisuus, joka tarjoaa monia toimintoja, joilla on sama nimi, mutta erilliset parametrit, kun useita tehtäviä on lueteltu yhden funktion nimen alla. On olemassa tiettyjä toimintojen ylikuormituksen sääntöjä, joita tulee noudattaa toimintoa ylikuormitettaessa.
Alla on C++-ohjelma, joka näyttää funktion ylikuormituksen tai käännösajan polymorfismin:
C++
// C++ program to demonstrate> // function overloading or> // Compile-time Polymorphism> #include> using> namespace> std;> class> Geeks {> public> :> > // Function with 1 int parameter> > void> func(> int> x)> > {> > cout <<> 'value of x is '> << x << endl;> > }> > // Function with same name but> > // 1 double parameter> > void> func(> double> x)> > {> > cout <<> 'value of x is '> << x << endl;> > }> > // Function with same name and> > // 2 int parameters> > void> func(> int> x,> int> y)> > {> > cout <<> 'value of x and y is '> << x <<> ', '> << y> > << endl;> > }> };> // Driver code> int> main()> {> > Geeks obj1;> > // Function being called depends> > // on the parameters passed> > // func() is called with int value> > obj1.func(7);> > // func() is called with double value> > obj1.func(9.132);> > // func() is called with 2 int values> > obj1.func(85, 64);> > return> 0;> }> |
>
postimyynti läpikulku binääripuu
>Lähtö
value of x is 7 value of x is 9.132 value of x and y is 85, 64>
Selitys: Yllä olevassa esimerkissä yksi funktio nimeltä funktio func() toimii eri tavalla kolmessa eri tilanteessa, mikä on polymorfismin ominaisuus. Saat lisätietoja tästä artikkelista - Toimintojen ylikuormitus C++:ssa .
B. Kuljettajan ylikuormitus
C++:lla on kyky tarjota operaattoreille erityinen merkitys tietotyypille, tämä ominaisuus tunnetaan operaattorin ylikuormituksena. Esimerkiksi merkkijonoluokan summausoperaattoria (+) voidaan käyttää kahden merkkijonon ketjuttamiseen. Tiedämme, että tämän operaattorin tehtävänä on lisätä kaksi operandia. Joten yksi operaattori '+', kun se sijoitetaan kokonaislukuoperandien väliin, lisää ne ja kun se sijoitetaan merkkijonooperandien väliin, ketjuttaa ne.
Alla on C++-ohjelma, joka osoittaa käyttäjän ylikuormituksen:
CPP
Task Manager linux
// C++ program to demonstrate> // Operator Overloading or> // Compile-Time Polymorphism> #include> using> namespace> std;> class> Complex {> private> :> > int> real, imag;> public> :> > Complex(> int> r = 0,> int> i = 0)> > {> > real = r;> > imag = i;> > }> > // This is automatically called> > // when '+' is used with between> > // two Complex objects> > Complex operator+(Complex> const> & obj)> > {> > Complex res;> > res.real = real + obj.real;> > res.imag = imag + obj.imag;> > return> res;> > }> > void> print() { cout << real <<> ' + i'> << imag << endl; }> };> // Driver code> int> main()> {> > Complex c1(10, 5), c2(2, 4);> > // An example call to 'operator+'> > Complex c3 = c1 + c2;> > c3.print();> }> |
>
>Lähtö
12 + i9>
Selitys: Yllä olevassa esimerkissä operaattori '+' on ylikuormitettu. Yleensä tätä operaattoria käytetään kahden luvun (kokonaislukujen tai liukulukujen) lisäämiseen, mutta tässä operaattorin tulee suorittaa kahden imaginaari- tai kompleksiluvun yhteenlasku. Jos haluat lisätietoja tästä, katso artikkeli - Kuljettajan ylikuormitus .
2. Ajonaikainen polymorfismi
Tämän tyyppinen polymorfismi saavutetaan Toiminnon ohitus . Myöhäinen sitoutuminen ja dynaaminen polymorfismi ovat ajonaikaisen polymorfismin muita nimiä. Toimintokutsu ratkaistaan suorituksen aikana ajonaikainen polymorfismi . Sitä vastoin käännösajan polymorfismissa kääntäjä määrittää, mikä funktiokutsu sitoutuu objektiin päätettyään sen suorituksen aikana.
A. Toiminnon ohitus
Toiminnon ohitus tapahtuu, kun johdetulla luokalla on määritelmä yhdelle perusluokan jäsenfunktiosta. Tämän perustoiminnon sanotaan ohitetun.

Toiminto ohittaa Selitys
Ajonaikainen polymorfismi datajäsenillä
C++:n datajäsenet eivät voi saavuttaa ajonaikaista polymorfismia. Katsotaanpa esimerkkiä, jossa käytämme kenttää pääluokan viitemuuttujan avulla, joka viittaa johdetun luokan esiintymään.
C++
tekstin kokoinen lateksi
// C++ program for function overriding with data members> #include> using> namespace> std;> // base class declaration.> class> Animal {> public> :> > string color => 'Black'> ;> };> // inheriting Animal class.> class> Dog :> public> Animal {> public> :> > string color => 'Grey'> ;> };> // Driver code> int> main(> void> )> {> > Animal d = Dog();> // accessing the field by reference> > // variable which refers to derived> > cout << d.color;> }> |
>
>Lähtö
Black>
Näemme, että pääluokan viittaus viittaa aina pääluokan datajäseneen.
B. Virtuaalinen toiminto
A virtuaalinen toiminto on jäsenfunktio, joka ilmoitetaan perusluokassa avainsanalla virtual ja määritetään uudelleen (Overridden) johdetussa luokassa.
Muutamia avainkohtia virtuaalifunktioista:
- Virtuaalitoiminnot ovat luonteeltaan dynaamisia.
- Ne määritellään lisäämällä avainsana virtuaalinen perusluokan sisällä ja ne ilmoitetaan aina perusluokalla ja ohitetaan aliluokassa
- Virtuaalifunktiota kutsutaan ajon aikana
Alla on C++-ohjelma virtuaalisen toiminnan esittelyyn:
C++
rakentajat javassa
// C++ Program to demonstrate> // the Virtual Function> #include> using> namespace> std;> // Declaring a Base class> class> GFG_Base {> public> :> > // virtual function> > virtual> void> display()> > {> > cout <<> 'Called virtual Base Class function'> > <<> '
'> ;> > }> > void> print()> > {> > cout <<> 'Called GFG_Base print function'> > <<> '
'> ;> > }> };> // Declaring a Child Class> class> GFG_Child :> public> GFG_Base {> public> :> > void> display()> > {> > cout <<> 'Called GFG_Child Display Function'> > <<> '
'> ;> > }> > void> print()> > {> > cout <<> 'Called GFG_Child print Function'> > <<> '
'> ;> > }> };> // Driver code> int> main()> {> > // Create a reference of class GFG_Base> > GFG_Base* base;> > GFG_Child child;> > base = &child;> > // This will call the virtual function> > base->GFG_Base::näyttö();> > // this will call the non-virtual function> > base->tulosta();> }> |
>
>Lähtö
Called virtual Base Class function Called GFG_Base print function>
Esimerkki 2:
C++
taulukon pituus java
// C++ program for virtual function overriding> #include> using> namespace> std;> class> base {> public> :> > virtual> void> print()> > {> > cout <<> 'print base class'> << endl;> > }> > void> show() { cout <<> 'show base class'> << endl; }> };> class> derived :> public> base {> public> :> > // print () is already virtual function in> > // derived class, we could also declared as> > // virtual void print () explicitly> > void> print() { cout <<> 'print derived class'> << endl; }> > void> show() { cout <<> 'show derived class'> << endl; }> };> // Driver code> int> main()> {> > base* bptr;> > derived d;> > bptr = &d;> > // Virtual function, binded at> > // runtime (Runtime polymorphism)> > bptr->tulosta();> > // Non-virtual function, binded> > // at compile time> > bptr->näytä();> > return> 0;> }> |
>
>Lähtö
print derived class show base class>