Cosa si intende per polimorfismo in C?


Migliore risposta

In realtà non esiste il concetto di polimorfismo in C. Il polimorfismo è una proprietà della programmazione orientata agli oggetti. Poiché C non è un OOP, C non ha alcun concetto di polimorfismo. Mentre il C ++ lo ha, dato che è un linguaggio di programmazione orientato agli oggetti (non completamente).

Polimorfismo significa avere molte forme. Esistono principalmente due tipi di polimorfismi in C ++:

  • Polimorfismo a tempo di compilazione
  • Polimorfismo a runtime
    1. Polimorfismo in fase di compilazione : questo tipo di polimorfismo si ottiene mediante sovraccarico di funzioni o sovraccarico di operatori.
  • Sovraccarico di funzioni : quando sono presenti più funzioni con lo stesso nome ma parametri diversi, si dice che queste funzioni sono sovraccaricate . Le funzioni possono essere sovraccaricate modifica del numero di argomenti o / e modifica del tipo di argomenti .

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

}

  • Sovraccarico degli operatori: C ++ fornisce anche unopzione per sovraccaricare gli operatori. Ad esempio, possiamo fare in modo che loperatore ("+") per la classe stringa concateni due stringhe. Sappiamo che questo è loperatore di addizione il cui compito è aggiungere agli operandi. Quindi un singolo operatore "+" quando viene inserito tra operandi interi, li aggiunge e quando viene inserito tra operandi stringa, li concatena.

#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. Polimorfismo di runtime: : questo tipo di polimorfismo si ottiene sostituendo la funzione.

  • Sostituzione della funzione: daltra parte si verifica quando una classe derivata ha una definizione per una delle funzioni membro della classe base. Si dice che quella funzione di base sia sovrascritta.

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

}

Risposta

Perché questa è la definizione di polimorfismo: il codice non " Non so fino al runtime qual è la classe effettiva di un oggetto.

Usando un esempio tradizionale, consideriamo una classe base Shape con un metodo draw (). Shape ha due sottoclassi: Circle e Square, che sovrascrivono entrambe draw () - hai indovinato - disegnano rispettivamente un cerchio e un quadrato.

Ora lapplicazione consente allutente di creare diverse forme. E la funzione di aggiornamento della vista le itera e chiama:

currentShape.draw ()

il compilatore non ha modo di sapere in fase di compilazione se currentShape sarà un quadrato o un cerchio e quindi quale implementazione draw () chiamare. La decisione deve essere presa in fase di esecuzione.

Certo, ci sono casi in cui il compilatore * può * dedurre la classe effettiva di un oggetto. In tal caso, probabilmente ottimizzerà la ricerca del runtime.

Notare che il polimorfismo e questo tempo di esecuzione vengono inviati allimplementazione corretta di una funzione a seconda del tipo di dati effettivo di uno (o più) dei suoi argomenti è molto utile e potente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *