Beseda polimorfizem pomeni imeti veliko oblik. Preprosto povedano, polimorfizem lahko definiramo kot sposobnost sporočila, da se prikaže v več kot eni obliki. Primer polimorfizma v resničnem življenju je oseba, ki ima lahko hkrati različne lastnosti. Moški je hkrati oče, mož in zaposleni. Tako se ista oseba v različnih situacijah obnaša različno. To se imenuje polimorfizem. Polimorfizem velja za eno od pomembnih lastnosti objektno orientiranega programiranja.
Vrste polimorfizma
- Polimorfizem med prevajanjem
- Polimorfizem izvajalnega okolja

Vrste polimorfizma
1. Polimorfizem med prevajanjem
To vrsto polimorfizma dosežemo s preobremenitvijo funkcij ali preobremenitvijo operatorjev.
A. Preobremenitev funkcij
Če obstaja več funkcij z enakim imenom, vendar različnimi parametri, se imenujejo funkcije preobremenjen, zato je to znano kot preobremenitev funkcij. Funkcije lahko preobremenite z spreminjanje števila argumentov ali/in spreminjanje vrste argumentov . Preprosto povedano, to je značilnost objektno orientiranega programiranja, ki zagotavlja veliko funkcij, ki imajo isto ime, vendar različne parametre, ko so številne naloge navedene pod enim imenom funkcije. Obstajajo določena pravila preobremenitve funkcij, ki jih je treba upoštevati pri preobremenitvi funkcije.
Spodaj je program C++ za prikaz preobremenitve funkcij ali polimorfizma med prevajanjem:
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;> }> |
>
oblikovalski vzorci java
>Izhod
value of x is 7 value of x is 9.132 value of x and y is 85, 64>
Pojasnilo: V zgornjem primeru ena sama funkcija z imenom funkcija func() deluje drugače v treh različnih situacijah, kar je lastnost polimorfizma. Če želite izvedeti več o tem, se obrnite na članek – Preobremenitev funkcij v C++ .
B. Preobremenitev operaterja
C++ ima možnost, da operaterjem zagotovi poseben pomen za tip podatkov, ta zmožnost je znana kot preobremenitev operaterja. Za združevanje dveh nizov lahko na primer uporabimo operator seštevanja (+) za razred nizov. Vemo, da je naloga tega operatorja sešteti dva operanda. Torej en sam operator '+', ko je postavljen med celoštevilske operande, jih doda in ko je postavljen med nizovne operande, jih združi.
Spodaj je program C++ za prikaz preobremenitve operaterja:
CPP
tiskanje izjave v Javi
// 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();> }> |
>
>Izhod
12 + i9>
Pojasnilo: V zgornjem primeru je operator '+' preobremenjen. Običajno se ta operator uporablja za seštevanje dveh števil (celih števil ali števil s plavajočo vejico), tukaj pa je operator narejen za seštevanje dveh namišljenih ali kompleksnih števil. Če želite izvedeti več o tem, glejte članek – Preobremenitev operaterja .
2. Polimorfizem izvajalnega okolja
To vrsto polimorfizma dosežemo z Preglasitev funkcije . Pozna vezava in dinamični polimorfizem sta druga imena za polimorfizem izvajalnega časa. Klic funkcije je razrešen med izvajanjem v izvajalni polimorfizem . Nasprotno pa pri polimorfizmu v času prevajanja prevajalnik določi, kateri klic funkcije naj poveže z objektom, potem ko ga izpelje med izvajanjem.
A. Preglasitev funkcije
Preglasitev funkcije se zgodi, ko ima izpeljani razred definicijo za eno od funkcij članov osnovnega razreda. Ta osnovna funkcija naj bi bila preglasena.

Razlaga preglasitve funkcije
Polimorfizem izvajalnega okolja s podatkovnimi člani
Polimorfizma izvajalnega okolja ni mogoče doseči s podatkovnimi člani v C++. Oglejmo si primer, kjer dostopamo do polja z referenčno spremenljivko nadrejenega razreda, ki se nanaša na primerek izpeljanega razreda.
C++
// 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;> }> |
dolžina niza bash
>
četrtletja v letu
>Izhod
Black>
Vidimo lahko, da se bo referenca nadrejenega razreda vedno nanašala na podatkovnega člana nadrejenega razreda.
B. Virtualna funkcija
A virtualna funkcija je funkcija članica, ki je deklarirana v osnovnem razredu s ključno besedo virtual in je na novo definirana (preglasena) v izpeljanem razredu.
Nekaj ključnih točk o virtualnih funkcijah:
- Virtualne funkcije so po naravi dinamične.
- Določeni so z vstavljanjem ključne besede virtualni znotraj osnovnega razreda in so vedno deklarirane z osnovnim razredom in preglasene v podrejenem razredu
- Med izvajanjem se kliče navidezna funkcija
Spodaj je program C++ za predstavitev virtualne funkcije:
C++
// 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::display();>> > // this will call the non-virtual function> > base->natisni();>> }> |
>
>Izhod
Called virtual Base Class function Called GFG_Base print function>
Primer 2:
C++
// 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->natisni();>> > // Non-virtual function, binded> > // at compile time> > bptr->pokaži();> > return> 0;> }> |
rezina java
>
>Izhod
print derived class show base class>