logo

Polymorfizmus C++

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

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á.

Prepisovanie funkcií v C++

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>