Vad menas med polymorfism i C?


Bästa svaret

Egentligen finns det inget begrepp med polymorfism i C. Polymorfism är en egenskap hos objektorienterad programmering. Eftersom C inte är en OOP har C inget begrepp med polymorfism. C ++ har, eftersom det är ett objektorienterat programmeringsspråk (inte helt).

Polymorfism betyder att ha många former. Det finns huvudsakligen två typer av polymorfe i C ++:

  • Kompileringstid polymorfism
  • Runtime polymorfism
    1. Kompilera tidspolymorfism : Denna typ av polymorfism uppnås genom funktionsöverbelastning eller operatörsöverbelastning.
  • Funktionsöverbelastning : När det finns flera funktioner med samma namn men olika parametrar sägs dessa funktioner vara överbelastade . Funktioner kan överbelastas av ändring av antal argument eller / och ändring av argumenttyp .

#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;

}

  • Operatörsöverbelastning: C ++ ger också möjlighet att överbelasta operatörer. Till exempel kan vi göra operatören (‘+’) för strängklass för att sammanfoga två strängar. Vi vet att detta är tilläggsoperatören vars uppgift är att lägga till operander. Så en operatör + när den placeras mellan heltaloperander, lägger till dem och när den placeras mellan strängoperander, sammanfogar dem.

#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: : Denna typ av polymorfism uppnås genom funktionen Overriding.

  • Funktionsöverstyrning: å andra sidan inträffar när en härledd klass har en definition för en av basfunktionens medlemsfunktioner. Den basfunktionen sägs åsidosättas.

#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;

}

Svar

Eftersom det är definitionen av polymorfism: koden inte t vet till runtime vad som är den aktuella klassen för något objekt.

Med hjälp av ett traditionellt exempel, låt oss överväga en basklassform med en draw () -metod. Form har två underklasser: Cirkel och Kvadrat som båda åsidosätter ritning () till - du gissade det - ritar en cirkel respektive en kvadrat.

Nu låter applikationen användaren skapa flera former. Och visningsuppdateringsfunktionen itererar över dem och ringer:

currentShape.draw ()

kompilatorn har inget sätt att veta vid sammanställningstid om currentShape kommer att vara en fyrkant eller en cirkel och därmed vilket rita () implementering att ringa. Beslutet måste fattas vid körning.

Beviljas, det finns fall där kompilatorn * kan * dra slutsatsen om ett objekts faktiska klass. I så fall kommer det möjligen att optimera körningstiden.

Observera att polymorfism och denna körtid skickas till korrekt implementering av en funktion beroende på den faktiska datatypen för en (eller flera) av dess argument är mycket användbart och kraftfullt.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *