Quentend-on par polymorphisme en C?


Meilleure réponse

En fait, il ny a aucun concept de polymorphisme en C. Le polymorphisme est une propriété de la programmation orientée objet. Puisque C n’est pas une POO, C n’a aucun concept de polymorphisme. Alors que C ++ la fait, puisquil sagit dun langage de programmation orienté objet (pas complètement).

Le polymorphisme signifie avoir de nombreuses formes. Il existe principalement deux types de polymorphsim en C ++:

  • Polymorphisme au moment de la compilation
  • Polymorphisme dexécution
    1. Polymorphisme au moment de la compilation : Ce type de polymorphisme est obtenu par surcharge de fonction ou surcharge dopérateur.
  • Surcharge de fonction : Lorsquil y a plusieurs fonctions avec le même nom mais des paramètres différents, ces fonctions sont dites surchargées . Les fonctions peuvent être surchargées par modification du nombre darguments ou / et modification du type darguments .

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

}

  • Surcharge des opérateurs: C ++ fournit également une option pour surcharger les opérateurs. Par exemple, nous pouvons créer l’opérateur («+») de la classe de chaînes pour concaténer deux chaînes. On sait que cest lopérateur daddition dont la tâche est dajouter aux opérandes. Ainsi, un seul opérateur + placé entre des opérandes entiers, les ajoute et lorsquil est placé entre des opérandes de chaîne, les concatène.

#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. Polymorphisme dexécution: : ce type de polymorphisme est obtenu par remplacement de fonction.

  • Remplacement de fonction: dautre part se produit lorsquune classe dérivée a une définition pour lune des fonctions membres de la classe de base. On dit que cette fonction de base est remplacée.

#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éponse

Parce que cest la définition du polymorphisme: le code ne fonctionne pas t savoir jusquà lexécution quelle est la classe réelle dun objet.

En utilisant un exemple traditionnel, considérons une classe de base Shape avec une méthode draw (). Shape a deux sous-classes: Circle et Square qui remplacent tous les deux draw () pour - vous lavez deviné - dessiner respectivement un cercle et un carré.

Maintenant, lapplication permet à lutilisateur de créer plusieurs formes. Et la fonction de mise à jour de vue les itère et appelle:

currentShape.draw ()

le compilateur na aucun moyen de savoir au moment de la compilation si currentShape sera un carré ou un cercle et donc quelle implémentation draw () appeler. La décision doit être prise lors de lexécution.

Certes, il y a des cas où le compilateur * peut * déduire la classe réelle dun objet. Dans ce cas, il optimisera éventuellement la recherche dexécution.

Notez que le polymorphisme et ce temps dexécution distribuent à limplémentation correcte dune fonction en fonction du type de données réel dun (ou plusieurs) de ses arguments est très utile et puissant.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *