logo

Polymorfismus C++

Slovo polymorfismus znamená mít mnoho podob. Jednoduše řečeno, můžeme polymorfismus definovat jako schopnost zprávy zobrazovat se ve více než jedné formě. Reálným příkladem polymorfismu je člověk, který může mít zároveň různé vlastnosti. Muž je zároveň otcem, manželem a zaměstnancem. Stejná osoba tedy projevuje různé chování v různých situacích. Tomu se říká polymorfismus. Polymorfismus je považován za jeden z důležitých rysů objektově orientovaného programování.

Typy polymorfismu

  • Polymorfismus v době kompilace
  • Polymorfismus za běhu
Typy polymorfismu

Typy polymorfismu



1. Polymorfismus v době kompilace

Tohoto typu polymorfismu je dosaženo přetížením funkcí nebo přetížením operátorů.

A. Přetížení funkcí

Pokud existuje více funkcí se stejným názvem, ale různými parametry, říká se, že funkce jsou přetížený, proto se tomu říká přetížení funkcí. Funkce mohou být přetíženy změna počtu argumentů nebo/a změna typu argumentů . Jednoduše řečeno, je to vlastnost objektově orientovaného programování poskytující mnoho funkcí, které mají stejný název, ale odlišné parametry, když je pod jedním názvem funkce uvedeno mnoho úloh. Existují určitá pravidla přetěžování funkcí, která by se měla při přetěžování funkce dodržovat.

Níže je uveden program C++, který ukazuje přetížení funkcí nebo polymorfismus v době kompilace:



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;> }>

>

double to string java

>

Výstup

value of x is 7 value of x is 9.132 value of x and y is 85, 64>

Vysvětlení: Ve výše uvedeném příkladu jedna funkce s názvem function func() působí odlišně ve třech různých situacích, což je vlastnost polymorfismu. Chcete-li se o tom dozvědět více, můžete se podívat na článek - Přetížení funkcí v C++ .

B. Přetížení operátora

C++ má schopnost poskytnout operátorům speciální význam pro datový typ, tato schopnost je známá jako přetížení operátorů. Například můžeme použít operátor sčítání (+) pro třídu string ke zřetězení dvou řetězců. Víme, že úkolem tohoto operátora je sečíst dva operandy. Takže jeden operátor „+“, když je umístěn mezi celočíselné operandy, je přidává a když je umístěn mezi řetězcové operandy, zřetězí je.

Níže je uveden program C++, který demonstruje přetížení operátorů:

CPP




nejkrásnější úsměv

// 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ýstup

android.process.acore se stále zastavuje
12 + i9>

Vysvětlení: Ve výše uvedeném příkladu je operátor „+“ přetížený. Obvykle se tento operátor používá k sečtení dvou čísel (celých čísel nebo čísel s plovoucí desetinnou čárkou), ale zde se operátor používá k sečtení dvou imaginárních nebo komplexních čísel. Chcete-li se o tomto dozvědět více, podívejte se na článek - Přetížení operátora .

2. Polymorfismus za běhu

Tohoto typu polymorfismu je dosaženo pomocí Přepsání funkcí . Pozdní vazba a dynamický polymorfismus jsou další názvy pro runtime polymorfismus. Volání funkce je vyřešeno za běhu v runtime polymorfismus . Naproti tomu u polymorfismu doby kompilace kompilátor určí, které volání funkce se má svázat s objektem poté, co je dedukuje za běhu.

A. Přepsání funkcí

Přepsání funkcí nastane, když má odvozená třída definici pro jednu z členských funkcí základní třídy. Říká se, že tato základní funkce je přepsána.

Přepisování funkcí v C++

Přepisování funkcí Vysvětlení

Polymorfismus běhu s datovými členy

Runtime Polymorphism nelze dosáhnout datovými členy v C++. Podívejme se na příklad, kdy k poli přistupujeme pomocí referenční proměnné rodičovské třídy, která odkazuje na instanci odvozené třídy.

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;> }>

>

>

Výstup

Black>

Vidíme, že odkaz na nadřazenou třídu bude vždy odkazovat na datový člen nadřazené třídy.

B. Virtuální funkce

A virtuální funkce je členská funkce, která je deklarována v základní třídě pomocí klíčového slova virtual a je předefinována (přepsána) v odvozené třídě.

Některé klíčové body o virtuálních funkcích:

  • Virtuální funkce jsou dynamické povahy.
  • Jsou definovány vložením klíčového slova virtuální uvnitř základní třídy a jsou vždy deklarovány základní třídou a přepsány v podřízené třídě
  • Během Runtime je volána virtuální funkce

Níže je uveden program C++, který demonstruje virtuální funkce:

C++

co je obj v javě




// 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();> }>

>

kolik nul v 1 miliardě

>

Výstup

Called virtual Base Class function Called GFG_Base print function>

Příklad 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->print();> >// Non-virtual function, binded> >// at compile time> >bptr->show();> >return> 0;> }>

>

>

Výstup

print derived class show base class>