¿Qué se entiende por polimorfismo en C?


Mejor respuesta

En realidad, no existe un concepto de polimorfismo en C. El polimorfismo es una propiedad de la programación orientada a objetos. Dado que C no es un OOP, C no tiene ningún concepto de polimorfismo. Mientras que C ++ lo ha hecho, ya que es un lenguaje de programación orientado a objetos (no completamente).

Polimorfismo significa tener muchas formas. Hay principalmente dos tipos de polimorfismos en C ++:

  • Polimorfismo en tiempo de compilación
  • Polimorfismo en tiempo de ejecución
    1. Polimorfismo de tiempo de compilación : este tipo de polimorfismo se logra mediante la sobrecarga de funciones o la sobrecarga de operadores.
  • Sobrecarga de funciones : cuando hay varias funciones con el mismo nombre pero diferentes parámetros, se dice que estas funciones están sobrecargadas . Las funciones pueden sobrecargarse por cambio en el número de argumentos o / y cambio en el tipo de argumentos .

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

}

  • Sobrecarga del operador: C ++ también ofrece la opción de sobrecargar operadores. Por ejemplo, podemos hacer que el operador ("+") para la clase de cadena concatene dos cadenas. Sabemos que este es el operador de suma cuya tarea es sumar operandos. Entonces, un solo operador + cuando se coloca entre operandos enteros, los agrega y cuando se coloca entre operandos de cadena, los 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 en tiempo de ejecución: : este tipo de polimorfismo se logra mediante la anulación de funciones.

  • Anulación de función: por otro lado ocurre cuando una clase derivada tiene una definición para una de las funciones miembro de la clase base. Se dice que esa función base está anulada.

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

}

Respuesta

Porque esa es la definición de polimorfismo: el código no No sé hasta el tiempo de ejecución cuál es la clase real de algún objeto.

Usando un ejemplo tradicional, consideremos una clase base Shape con un método draw (). Shape tiene dos subclases: Circle y Square que anulan draw () para, lo adivinaste, dibujar un círculo y un cuadrado respectivamente.

Ahora la aplicación permite al usuario crear varias formas. Y la función de actualización de vista itera sobre ellos y llama:

currentShape.draw ()

el compilador no tiene forma de saber en tiempo de compilación si currentShape será un cuadrado o un círculo y por lo tanto, qué implementación de draw () llamar. La decisión debe tomarse en tiempo de ejecución.

Por supuesto, hay casos en los que el compilador * puede * inferir la clase real de un objeto. En ese caso, posiblemente optimizará la búsqueda en tiempo de ejecución.

Tenga en cuenta que el polimorfismo y este tiempo de ejecución se envían a la implementación correcta de una función dependiendo del tipo de datos real de uno (o más) de sus argumentos es muy útil y poderoso.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *