C ++ - polymorfismi

Tässä opetusohjelmassa opitaan polymorfismista C ++: ssa esimerkkien avulla.

Polymorfismi on tärkeä objektiivisen ohjelmoinnin käsite. Se tarkoittaa yksinkertaisesti useampaa kuin yhtä muotoa. Eli sama olio (toiminto tai operaattori) käyttäytyy eri tavoin eri tilanteissa. Esimerkiksi,

+Operaattori C ++ käytetään suorittamaan kaksi tiettyjä toimintoja. Kun sitä käytetään numeroiden (kokonaislukujen ja liukulukujen) kanssa, se suorittaa lisäyksen.

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

Ja kun käytämme +operaattoria merkkijonojen kanssa, se suorittaa merkkijonon ketjutuksen. Esimerkiksi,

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

Voimme toteuttaa polymorfismin C ++: ssa seuraavilla tavoilla:

  1. Toiminnon ylikuormitus
  2. Kuljettajan ylikuormitus
  3. Toiminnon ohittaminen
  4. Virtuaalitoiminnot

C ++ -toiminto Ylikuormitus

C ++: ssa voimme käyttää kahta funktiota, joilla on sama nimi, jos niillä on erilaiset parametrit (joko tyypit tai argumenttien lukumäärä).

Ja riippuen argumenttien lukumäärästä / tyypistä, kutsutaan erilaisia ​​toimintoja. Esimerkiksi,

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

Tuotos

 Summa 1 = 11 Summa 2 = 12,1 Summa 3 = 18

Tässä olemme luoneet 3 erilaista sum()toimintoa eri parametreilla (parametrien lukumäärä / tyyppi). Ja funktion kutsun aikana lähetettyjen argumenttien perusteella tietty sum()kutsutaan.

Se on käännösaikapolymorfismi, koska kääntäjä tietää suoritettavan toiminnon ennen ohjelman kokoamista.

Lisätietoja on C ++ -toimintojen ylikuormitusoppaassa.

C ++ - käyttäjän ylikuormitus

C ++: ssa voimme ylikuormittaa operaattoria niin kauan kuin käytämme käyttäjän määrittelemiä tyyppejä, kuten esineitä tai rakenteita.

Emme voi käyttää operaattorin ylikuormitusta perustyyppiä kuten int, doublejne

Operaattorin ylikuormitus on periaatteessa toimintojen ylikuormitusta, jossa eri operaattoritoiminnoilla on sama symboli, mutta erilaiset operandit.

Ja operaattoreista riippuen suoritetaan erilaisia ​​operaattoritoimintoja. Esimerkiksi,

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

Tuotos

 Laskenta: 6

Tässä olemme ylikuormittaneet ++operaattoria, joka toimii Countluokan esineillä (tässä tapauksessa objektien määrä1).

Olemme käyttäneet tätä ylikuormitettua operaattoria lisäämään suoraan count1-objektin arvomuuttujaa 1.

Tämä on myös kokoamisajan polymorfismi .

Jos haluat lisätietoja, käy C ++ -operaattorin ylikuormitusoppaassa.

C ++ -toiminnon ohittaminen

C ++ - perinnössä meillä voi olla sama funktio perusluokassa kuin sen johdetuissa luokissa.

Kun kutsumme funktiota käyttämällä johdetun luokan objektia, johdetun luokan funktio suoritetaan perusluokassa olevan sijasta.

Joten, eri toiminnot suoritetaan riippuen objektista, joka kutsuu toimintoa.

Tätä kutsutaan funktion ohittavaksi C ++: ssa. Esimerkiksi,

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

Tuotos

 Johdettu funktio

Tässä olemme käyttäneet print()funktiota Baseluokassa ja samaa funktiota Derivedluokassa

Kun soitamme print()käyttämällä Derivedjohdettua objektia1, se ohittaa print()toiminnon Basesuorittamalla luokan print()toiminnon Derived.

Se on ajonaikainen polymorfismi, koska kääntäjä ei ratkaise funktion kutsua, mutta se ratkaistaan ​​sen sijaan ajon aikana.

Jos haluat lisätietoja, käy C ++ -toiminnon ohittamisoppaassa.

C ++ virtuaalitoiminnot

C ++: ssa emme välttämättä pysty ohittamaan toimintoja, jos käytämme perusluokan osoittinta osoittamaan johdetun luokan objektille.

Käyttäen virtuaalifunktioita pohjaan luokan varmistaa , että toiminto voi olla ohitettu näissä tapauksissa.

Täten virtuaaliset toiminnot tosiasiassa kuuluvat toimintojen ohittamiseen . Esimerkiksi,

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

Mielenkiintoisia artikkeleita...