Slovo polymorfizmus znamená mať mnoho podôb. Jednoducho povedané, polymorfizmus môžeme definovať ako schopnosť správy zobraziť sa vo viac ako jednej forme. Príkladom polymorfizmu v reálnom živote je človek, ktorý môže mať zároveň rôzne vlastnosti. Muž je zároveň otcom, manželom a zamestnancom. Takže tá istá osoba prejavuje rôzne správanie v rôznych situáciách. Toto sa nazýva polymorfizmus. Polymorfizmus sa považuje za jednu z dôležitých vlastností objektovo orientovaného programovania.
Typy polymorfizmu
- Polymorfizmus v čase kompilácie
- Runtime Polymorfizmus

Typy polymorfizmu
1. Polymorfizmus v čase kompilácie
Tento typ polymorfizmu sa dosahuje preťažením funkcie alebo preťažením operátora.
A. Preťaženie funkcií
Ak existuje viacero funkcií s rovnakým názvom, ale rôznymi parametrami, potom sa o týchto funkciách hovorí, že sú preťažený, preto je to známe ako preťaženie funkcií. Funkcie môžu byť preťažené zmena počtu argumentov alebo/a zmena typu argumentov . Jednoducho povedané, je to vlastnosť objektovo orientovaného programovania, ktorá poskytuje mnoho funkcií, ktoré majú rovnaký názov, ale odlišné parametre, keď je pod jedným názvom funkcie uvedený počet úloh. Existujú určité pravidlá preťaženia funkcií, ktoré by sa mali dodržiavať pri preťažovaní funkcie.
Nižšie je uvedený program C++ na zobrazenie preťaženia funkcií alebo polymorfizmu v čase kompilácie:
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;> }> |
>
linuxové chybové kódy
>Výkon
value of x is 7 value of x is 9.132 value of x and y is 85, 64>
Vysvetlenie: Vo vyššie uvedenom príklade jedna funkcia s názvom function func() pôsobí odlišne v troch rôznych situáciách, čo je vlastnosť polymorfizmu. Ak sa chcete dozvedieť viac o tom, môžete si prečítať článok - Preťaženie funkcií v C++ .
B. Preťaženie operátora
C++ má schopnosť poskytnúť operátorom špeciálny význam pre dátový typ, táto schopnosť je známa ako preťaženie operátorov. Napríklad môžeme použiť operátor sčítania (+) pre triedu reťazcov na zreťazenie dvoch reťazcov. Vieme, že úlohou tohto operátora je sčítať dva operandy. Takže jeden operátor „+“, keď je umiestnený medzi celočíselné operandy, ich pridáva a keď je umiestnený medzi reťazcové operandy, spája ich.
Nižšie je uvedený program C++, ktorý demonštruje preťaženie operátora:
CPP
java string nahradenie
// 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();> }> |
>
>Výkon
12 + i9>
Vysvetlenie: Vo vyššie uvedenom príklade je operátor „+“ preťažený. Zvyčajne sa tento operátor používa na sčítanie dvoch čísel (celých čísel alebo čísel s pohyblivou rádovou čiarkou), ale tu sa operátor používa na sčítanie dvoch imaginárnych alebo komplexných čísel. Ak sa chcete dozvedieť viac o tomto, pozrite si článok - Preťaženie operátora .
2. Polymorfizmus za behu
Tento typ polymorfizmu sa dosahuje pomocou Prepísanie funkcie . Neskorá väzba a dynamický polymorfizmus sú iné názvy pre polymorfizmus za behu. Volanie funkcie sa vyrieši za behu v runtime polymorfizmus . Na rozdiel od toho pri polymorfizme času kompilácie kompilátor určí, ktoré volanie funkcie sa má naviazať na objekt po jeho odvodení za behu.
A. Prepísanie funkcie
Prepísanie funkcie nastane, keď odvodená trieda má definíciu pre jednu z členských funkcií základnej triedy. Hovorí sa, že táto základná funkcia je prepísaná.

Prepísanie funkcie Vysvetlenie
Polymorfizmus za behu s dátovými členmi
Runtime Polymorfizmus nie je možné dosiahnuť dátovými členmi v C++. Pozrime sa na príklad, kde pristupujeme k poľu pomocou referenčnej premennej nadradenej triedy, ktorá odkazuje na inštanciu odvodenej triedy.
C++
chrome adresný riadok
// 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;> }> |
>
>Výkon
Black>
Vidíme, že odkaz na nadradenú triedu bude vždy odkazovať na dátový člen nadradenej triedy.
B. Virtuálna funkcia
A virtuálna funkcia je členská funkcia, ktorá je deklarovaná v základnej triede pomocou kľúčového slova virtual a je predefinovaná (prepísaná) v odvodenej triede.
Niektoré kľúčové body o virtuálnych funkciách:
- Virtuálne funkcie majú dynamický charakter.
- Definujú sa vložením kľúčového slova virtuálne vnútri základnej triedy a sú vždy deklarované so základnou triedou a prepísané v podradenej triede
- Počas Runtime sa volá virtuálna funkcia
Nižšie je uvedený program C++ na demonštráciu virtuálnej funkcie:
C++
sú replace
// 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->print();> }> |
>
>Výkon
Called virtual Base Class function Called GFG_Base print function>
Príklad 2:
C++
objekt v programovaní 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->print();> > // Non-virtual function, binded> > // at compile time> > bptr->show();> > return> 0;> }> |
>
>Výkon
print derived class show base class>