Nejlepší odpověď
Ve skutečnosti ve skutečnosti neexistuje koncept polymorfismu v C. Polymorfismus je vlastnost objektově orientovaného programování. Protože C není OOP, C nemá žádný koncept polymorfismu. Zatímco C ++ má, protože se jedná o objektově orientovaný programovací jazyk (ne úplně).
Polymorfismus znamená mít mnoho forem. V C ++ existují hlavně dva typy polymorfů:
- Polymorfismus doby kompilace
- Runtime Polymorphism
- Polymorfismus času kompilace : Tento typ polymorfismu je dosažen přetížením funkce nebo přetížením operátora.
- Přetížení funkce : Pokud existuje více funkcí se stejným názvem, ale s různými parametry, pak se o těchto funkcích říká, že jsou přetíženy . Funkce mohou být přetíženy změnou počtu argumentů nebo změnou typu argumentů .
#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;
}
};
int main() {
Geeks obj1;
// The first "func" is called
obj1.func(7);
// The second "func" is called
obj1.func(9.132);
// The third "func" is called
obj1.func(85,64);
return 0;
}
- Přetížení operátorů: C ++ také poskytuje možnost přetížení operátorů. Například můžeme vytvořit operátor („+“) pro třídu řetězců tak, aby zřetězil dva řetězce. Víme, že se jedná o operátor přidání, jehož úkolem je přidat k operandům. Takže jediný operátor +, když je umístěn mezi celočíselné operandy, přidá je a když je umístěn mezi řetězcové operandy, spojí je.
#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; }
};
int main()
{
Complex c1(10, 5), c2(2, 4);
Complex c3 = c1 + c2; // An example call to "operator+"
c3.print();
}
2. Runtime Polymorphism: : tohoto typu polymorfismu je dosaženo přepsáním funkce.
- Přepsání funkcí: na druhou stranu nastane, když má odvozená třída definici jedné z členských funkcí základní třídy. Tato základní funkce je údajně přepsána.
#include
using namespace std;
// Base class
class Parent
{
public:
void print()
{
cout << "The Parent print function was called" << endl;
}
};
// Derived class
class Child : public Parent
{
public:
// definition of a member function already present in Parent
void print()
{
cout << "The child print function was called" << endl;
}
};
//main function
int main()
{
//object of parent class
Parent obj1;
//object of child class
Child obj2 = Child();
// obj1 will call the print function in Parent
obj1.print();
// obj2 will override the print function in Parent
// and call the print function in Child
obj2.print();
return 0;
}
Odpověď
Protože to je definice polymorfismu: kód není Do runtime nevíme, jaká je skutečná třída nějakého objektu.
Na tradičním příkladu uvažujme základní třídu Shape s metodou draw (). Tvar má dvě podtřídy: Kruh a Čtverec, které oba přepisují draw (), aby - uhádli jste - nakreslili kruh a čtverec.
Nyní aplikace umožňuje uživateli vytvořit několik tvarů. A funkce aktualizace pohledu nad nimi iteruje a volá:
currentShape.draw ()
kompilátor nemá v době kompilace žádný způsob, jak zjistit, zda currentShape bude čtverec nebo kruh a tedy které draw () implementace volat. Rozhodnutí musí být učiněno za běhu.
Je pravda, že existují případy, kdy kompilátor * může * odvodit skutečnou třídu objektu. V takovém případě pravděpodobně optimalizuje vyhledávání běhového prostředí.
Všimněte si, že polymorfismus a tento běh odesílají ke správné implementaci funkce v závislosti na skutečném datovém typu jedné (nebo více) jejích argumenty je velmi užitečné a silné.