Selles õpetuses õpime näidete abil C ++ keeles esinevat polümorfismi.
Polümorfism on objektorienteeritud programmeerimise oluline mõiste. See tähendab lihtsalt mitut vormi. See tähendab, et üksus (funktsioon või operaator) käitub erinevates stsenaariumides erinevalt. Näiteks,
+
Operaator C ++ kasutatakse täita kaks konkreetset funktsiooni. Kui seda kasutatakse koos arvudega (täisarvud ja ujukomaarvud), täidab see liitmise.
int a = 5; int b = 6; int sum = a + b; // sum = 11
Ja kui kasutame +
operaatorit stringidega, teostab see stringide liitmise. Näiteks,
string firstName = "abc "; string lastName = "xyz"; // name = "abc xyz" string name = firstName + lastName;
Saame rakendada polümorfismi C ++ versioonis järgmistel viisidel:
- Funktsiooni ülekoormus
- Operaatori ülekoormus
- Funktsiooni ülekaalukas
- Virtuaalsed funktsioonid
C ++ Funktsioon Ülekoormus
C ++ - s saame kasutada kahte sama nimega funktsiooni, kui neil on erinevad parameetrid (kas tüübid või argumentide arv).
Ja sõltuvalt argumentide arvust / tüübist kutsutakse erinevaid funktsioone. Näiteks,
// 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äljund
Summa 1 = 11 Summa 2 = 12,1 Summa 3 = 18
Siin oleme loonud 3 sum()
erinevat parameetritega funktsiooni (parameetrite arv / tüüp). Ja funktsioonikõne ajal edastatud argumentide põhjal sum()
kutsutakse konkreetne .
See on kompileerimisaegne polümorfism, sest kompilaator teab enne programmi kompileerimist, millist funktsiooni täita.
Selle kohta lisateabe saamiseks külastage meie C ++ funktsioonide ülekoormamise õpetust.
C ++ operaatori ülekoormus
C ++ versioonis võime operaatorit üle koormata seni, kuni töötame kasutaja määratletud tüüpidega nagu objektid või struktuurid.
Me ei saa kasutada operaator ülekoormus jaoks põhitüüpi nagu int
, double
jne
Operaatori ülekoormamine on põhimõtteliselt funktsioonide ülekoormamine, kus erinevatel operaatori funktsioonidel on sama sümbol, kuid erinevad operandid.
Ja sõltuvalt operandidest täidetakse erinevaid operaatori funktsioone. Näiteks,
// 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äljund
Loendus: 6
Siin oleme üle koormanud ++
operaatori, mis opereerib Count
klassi objektidel (antud juhul objektide arv1).
Oleme seda ülekoormatud operaatorit suurendanud count1 objekti väärtuse muutuja otse 1
.
See on ka kompileerimisaegne polümorfism .
Lisateabe saamiseks külastage meie C ++ operaatori ülekoormamise õpetust.
C ++ Funktsiooni ülimuslikkus
C ++ pärimisel võib meil olla nii baasklassis kui ka selle tuletatud klassides sama funktsioon.
Kui kutsume funktsiooni tuletatud klassi objekti abil, täidetakse tuletatud klassi funktsioon baasklassi funktsiooni asemel.
Niisiis, sõltuvalt objektist, mis funktsiooni kutsub, käivitatakse erinevad funktsioonid.
Seda nimetatakse funktsioonis C ++ ülimuslikuks . Näiteks,
// 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äljund
Tuletatud funktsioon
Siin oleme kasutanud print()
funktsiooni Base
klassi ja sama funktsiooni Derived
klassi
Kui me nimetame print()
kasutades Derived
objekti derived1, see alistab print()
funktsiooni Base
täitmisele print()
funktsioon Derived
klassi.
See on käituse polümorfism, kuna funktsioonikõne pole kompilaatori poolt lahendatud, kuid see on lahendatud hoopis käituse ajal.
Lisateabe saamiseks külastage meie C ++ funktsioonide alistamise õpetust.
C ++ virtuaalsed funktsioonid
C ++ versioonis ei pruugi me funktsioone alistada, kui kasutame tuletatud klassi objektile osutamiseks baasklassi kursorit.
Virtuaalfunktsioonide kasutamine baasklassis tagab funktsiooni nendel juhtudel alistamise.
Seega kuuluvad virtuaalsed funktsioonid tegelikult funktsioonide ülimuslikkuse alla . Näiteks,
// 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.