C ++ polymorfismus

V tomto tutoriálu se pomocí příkladů dozvíme o polymorfismu v C ++.

Polymorfismus je důležitý koncept objektově orientovaného programování. Znamená to prostě více než jednu formu. To znamená, že stejná entita (funkce nebo operátor) se chová odlišně v různých scénářích. Například,

+Operátor v C ++ slouží k provádění dvě specifické funkce. Při použití s ​​čísly (celá čísla a čísla s plovoucí desetinnou čárkou) provede sčítání.

 int a = 5; int b = 6; int sum = a + b; // sum = 11

A když použijeme +operátor s řetězci, provede zřetězení řetězců. Například,

 string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;

Polymorfismus v C ++ můžeme implementovat pomocí následujících způsobů:

  1. Přetížení funkce
  2. Přetížení obsluhy
  3. Přepsání funkce
  4. Virtuální funkce

Přetížení funkce v C ++

V C ++ můžeme použít dvě funkce se stejným názvem, pokud mají různé parametry (typy nebo počet argumentů).

A v závislosti na počtu / typu argumentů jsou volány různé funkce. Například,

 // C++ program to overload sum() function #include using namespace std; // Function with 2 int parameters int sum(int num1, int num2) ( return num1 + num2; ) // Function with 2 double parameters double sum(double num1, double num2) ( return num1 + num2; ) // Function with 3 int parameters int sum(int num1, int num2, int num3) ( return num1 + num2 + num3; ) int main() ( // Call function with 2 int parameters cout << "Sum 1 = " << sum(5, 6) << endl; // Call function with 2 double parameters cout << "Sum 2 = " << sum(5.5, 6.6) << endl; // Call function with 3 int parameters cout << "Sum 3 = " << sum(5, 6, 7) << endl; return 0; )

Výstup

 Součet 1 = 11 Součet 2 = 12,1 Součet 3 = 18

Zde jsme vytvořili 3 různé sum()funkce s různými parametry (počet / typ parametrů). A na základě argumentů předaných během volání funkce se volá konkrétní sum().

Je to polymorfismus v době kompilace, protože kompilátor ví, kterou funkci má provést před kompilací programu.

Chcete-li se dozvědět více o, navštivte náš kurz Přetížení funkcí v C ++.

Přetížení operátora C ++

V C ++ můžeme operátor přetížit, pokud pracujeme na uživatelem definovaných typech, jako jsou objekty nebo struktury.

Nemůžeme použít operátor přetížení základních typů jako int, doubleatd

Přetížení operátoru je v podstatě přetížení funkce, kde různé funkce operátora mají stejný symbol, ale různé operandy.

A v závislosti na operandech se provádějí různé funkce operátorů. Například,

 // C++ program to overload ++ when used as prefix #include using namespace std; class Count ( private: int value; public: // Constructor to initialize count to 5 Count() : value(5) () // Overload ++ when used as prefix void operator ++() ( value = value + 1; ) void display() ( cout << "Count: " << value << endl; ) ); int main() ( Count count1; // Call the "void operator ++()" function ++count1; count1.display(); return 0; )

Výstup

 Počet: 6

Zde jsme přetížili ++operátor, který pracuje s objekty Counttřídy (v tomto případě objekt count1).

Tento přetížený operátor jsme použili k přímému zvýšení hodnotové proměnné objektu count1 o 1.

Toto je také polymorfismus v době kompilace .

Další informace najdete v našem výukovém programu Přetížení operátora C ++.

Přepsání funkce C ++

V C ++ dědičnosti můžeme mít stejnou funkci v základní třídě i v jejích odvozených třídách.

Když funkci zavoláme pomocí objektu odvozené třídy, provede se funkce odvozené třídy namísto funkce v základní třídě.

Různé funkce se tedy provádějí v závislosti na objektu, který funkci volá.

Toto je známé jako přepsání funkcí v C ++. Například,

 // C++ program to demonstrate function overriding #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" << endl; ) ); int main() ( Derived derived1; // Call print() function of Derived class derived1.print(); return 0; )

Výstup

 Odvozená funkce

Zde jsme použili print()funkci ve Basetřídě a stejnou funkci ve Derivedtřídě

Když voláme print()pomocí Derivedobjektu odvozeného1, přepíše print()funkci Baseprovedením print()funkce Derivedtřídy.

Je to běhový polymorfismus, protože volání funkce není kompilátorem vyřešeno, ale je místo toho vyřešeno za běhu.

Chcete-li se dozvědět více, navštivte náš tutoriál Přepisování funkcí C ++.

Virtuální funkce C ++

V C ++ možná nebudeme moci přepsat funkce, pokud použijeme ukazatel základní třídy k nasměrování na objekt odvozené třídy.

Použití virtuálních funkcí v základní třídě zajišťuje, že v těchto případech lze funkci přepsat.

Tak, virtuální funkce ve skutečnosti spadají do funkce najetí vozidel . Například,

 // C++ program to demonstrate the use of virtual functions #include using namespace std; class Base ( public: virtual void print() ( cout << "Base Function" << endl; ) ); class Derived : public Base ( public: void print() ( cout << "Derived Function" 

Output

 Derived Function

Here, we have used a virtual function print() in the Base class to ensure that it is overridden by the function in the Derived class.

Virtual functions are runtime polymorphism.

To learn more, visit our C++ Virtual Functions tutorial.

Why Polymorphism?

Polymorphism allows us to create consistent code. For example,

Suppose we need to calculate the area of a circle and a square. To do so, we can create a Shape class and derive two classes Circle and Square from it.

In this case, it makes sense to create a function having the same name calculateArea() in both the derived classes rather than creating functions with different names, thus making our code more consistent.

Zajímavé články...