Co je míněno polymorfismem v C?


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
    1. 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é.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *