Ce se înțelege prin polimorfism în C?


Cel mai bun răspuns

De fapt nu există un concept de polimorfism în C. Polimorfismul este o proprietate a programării orientate pe obiecte. Deoarece C nu este un OOP, C nu are niciun concept de polimorfism. În timp ce C ++ are, deoarece este un limbaj de programare orientat pe obiecte (nu complet).

Polimorfism înseamnă să ai multe forme. Există, în principal, două tipuri de polimorf în C ++:

  • Compilarea timpului Polimorfism
  • Runtime Polymorphism
    1. Compilează polimorfismul de timp : acest tip de polimorfism se realizează prin supraîncărcarea funcției sau prin supraîncărcarea operatorului. : Când există mai multe funcții cu același nume, dar parametri diferiți, se spune că aceste funcții sunt supraîncărcate . Funcțiile pot fi supraîncărcate prin schimbarea numărului de argumente sau / și modificare a tipului de argumente .

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

}

  • Suprasolicitarea operatorului: C ++ oferă și opțiunea de supraîncărcare a operatorilor. De exemplu, putem face ca operatorul (‘+’) pentru clasa șir să concateneze două șiruri. Știm că acesta este operatorul de adăugare a cărui sarcină este să se adauge la operanzi. Deci, un singur operator + atunci când este plasat între operanzi întregi, îi adaugă și când este plasat între operanzi șir, îi concatenează.

#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. Polimorfismul de execuție: : Acest tip de polimorfism este realizat prin funcția Overriding.

  • Function Overriding: pe de altă parte, apare atunci când o clasă derivată are o definiție pentru una dintre funcțiile membre ale clasei de bază. Se spune că acea funcție de bază este anulată.

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

}

Răspuns

Pentru că asta este definiția polimorfismului: codul nu este Nu știți până la runtime care este clasa reală a unui obiect.

Folosind un exemplu tradițional, să luăm în considerare o clasă de bază Shape cu o metodă draw (). Forma are două subclase: Cerc și Pătrat, care ambele suprascriu desenează () pentru - ai ghicit - desenează un cerc și respectiv un pătrat.

Acum aplicația permite utilizatorului să creeze mai multe forme. Iar funcția de actualizare a vizualizării iterează peste ele și apelează:

currentShape.draw ()

compilatorul nu are cum să știe la momentul compilării dacă currentShape va fi un pătrat sau un cerc și astfel care desenează () punerea în aplicare. Decizia trebuie luată la runtime.

Acordat, există cazuri în care compilatorul * poate * deduce clasa reală a unui obiect. În acest caz, este posibil să optimizeze aspectul de runtime în sus.

Rețineți că polimorfismul și acest timp de execuție se trimit la implementarea corectă a unei funcții în funcție de tipul de date real al unuia (sau mai multor) dintre argumentele sunt foarte utile și puternice.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *