Hva menes med polymorfisme i C?


Beste svaret

Egentlig er det ikke noe begrep med polymorfisme i C. Polymorfisme er en egenskap til objektorientert programmering. Siden C ikke er en OOP, har C ikke noe begrep med polymorfisme. Mens C ++ har, siden det er et objektorientert programmeringsspråk (ikke helt).

Polymorfisme betyr å ha mange former. Det er hovedsakelig to typer polymorfe i C ++:

  • Kompileringstid polymorfisme
  • Runtime polymorfisme
    1. Kompileringstidspolymorfisme : Denne typen polymorfisme oppnås ved funksjonsoverbelastning eller operatøroverbelastning.
  • Funksjon Overbelastning : Når det er flere funksjoner med samme navn, men forskjellige parametere, sies det at disse funksjonene er overbelastet . Funksjoner kan overbelastes av endring i antall argumenter eller / og endring i argumenttype .

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

}

  • Overbelastning av operatør: C ++ gir også mulighet for overbelastning av operatører. For eksempel kan vi lage operatøren (‘+’) for strengklasse for å sammenkoble to strenger. Vi vet at dette er tilleggsoperatøren hvis oppgave er å legge til operander. Så en enkelt operatør + når den er plassert mellom heltalsoperander, legger dem til og når den plasseres mellom strengoperander, sammenkobles 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: : Denne typen polymorfism oppnås ved Funksjon Overriding.

  • Funksjon Overriding: derimot oppstår når en avledet klasse har en definisjon for en av medlemsfunksjonene til baseklassen. Den basefunksjonen sies å bli overstyrt.

#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

Fordi det er definisjonen av polymorfisme: koden ikke t vet til kjøretiden hva som er den faktiske klassen til et eller annet objekt.

Ved å bruke et tradisjonelt eksempel, la oss vurdere en basisklasse Shape med en draw () -metode. Form har to underklasser: Sirkel og Firkant som begge overstyrer tegning () til - du gjettet det - tegner henholdsvis en sirkel og en firkant.

Nå lar applikasjonen brukeren opprette flere former. Og visningsoppdateringsfunksjonen itererer over dem og kaller:

currentShape.draw ()

kompilatoren har ingen måte å vite på kompileringstidspunktet om currentShape vil være en firkant eller en sirkel og dermed som trekker () implementering å ringe. Beslutningen må tas i løpetid.

Det er gitt tilfeller der kompilatoren * kan utlede den faktiske klassen til et objekt. I så fall vil det muligens optimalisere oppkjøringen av kjøretiden.

Merk at polymorfisme og denne kjøretiden sendes til riktig implementering av en funksjon avhengig av den faktiske datatypen til en (eller flere) av dens argumenter er veldig nyttige og kraftige.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *