Explicación detallada de la diferencia entre polimorfismo estático y polimorfismo dinámico en C++

Tabla de contenido

1. Concepto y clasificación de polimorfismo.

2. El papel del polimorfismo

3. Polimorfismo estático

4. Polimorfismo dinámico

5. Resumen


1. Concepto y clasificación de polimorfismo.

        El polimorfismo es una característica importante de la programación orientada a objetos (OOP). Polimorfismo significa literalmente múltiples estados. En los lenguajes orientados a objetos, una interfaz con múltiples implementaciones es el polimorfismo. El polimorfismo en C++ se materializa en dos etapas: compilación y tiempo de ejecución. El polimorfismo en tiempo de compilación es un polimorfismo estático y la interfaz utilizada se puede determinar en el momento de la compilación. El polimorfismo en tiempo de ejecución es un polimorfismo dinámico y la interfaz referenciada específica solo se puede determinar en tiempo de ejecución.

imagen

        La diferencia entre el polimorfismo estático y el polimorfismo dinámico es en realidad cuándo asociar la implementación de la función y la llamada a la función, ya sea en tiempo de compilación o de ejecución, es decir, si la dirección de la función está vinculada antes o después. El polimorfismo estático significa que la dirección de llamada de la función se puede determinar durante la compilación y se produce el código, lo que es estático, lo que significa que la dirección se vincula temprano. El polimorfismo estático a menudo también se denomina enlace estático. El polimorfismo dinámico significa que la dirección de una llamada a una función no se puede determinar durante el compilador y debe determinarse en tiempo de ejecución. Es un enlace tardío. El polimorfismo dinámico a menudo también se denomina enlace dinámico.


2. El papel del polimorfismo

        ¿Por qué utilizar polimorfismo? La encapsulación puede modularizar el código y la herencia puede ampliar el código existente. Su propósito es reutilizar el código. El propósito del polimorfismo es la reutilización de la interfaz. El polimorfismo estático implementa la misma interfaz de diferentes maneras y llama a diferentes implementaciones según diferentes parámetros (diferentes números o tipos) pasados. El polimorfismo dinámico significa que no importa qué clase de objeto se pase, la función puede llamar a los métodos implementados por los respectivos objetos a través de la misma interfaz.


3. Polimorfismo estático

        El polimorfismo estático a menudo se implementa mediante sobrecarga de funciones y plantillas (programación genérica). Para obtener más detalles, consulte el siguiente código:

#include <iostream>
using namespace std;

//两个函数构成重载
int add(int a, int b)
{
  cout<<"in add_int_int()"<<endl;
  return a + b;
}
double add(double a, double b)
{
  cout<<"in add_double_doube()"<<endl;
  return a + b;
}

//函数模板(泛型编程)
template <typename T>
T add(T a, T b)
{
  cout<<"in func tempalte"<<endl;
  return a + b;
}

int main()
{
  cout<<add(1,1)<<endl;           //调用int add(int a, int b)
  cout<<add(1.1,1.1)<<endl;       //调用double add(double a, double b)
  cout<<add<char>('A',' ')<<endl; //调用模板函数,输出小写字母a
}

        Salida del programa:

in add_int_int()
2
in add_double_doube()
2.2
in func tempalte
a

4. Polimorfismo dinámico

        El uso más común del polimorfismo dinámico es declarar un puntero de clase base, usar el puntero para señalar cualquier objeto de subclase y llamar a la función virtual correspondiente. Se pueden llamar diferentes métodos según las diferentes subclases a las que apunta. Si no se utilizan funciones virtuales, es decir, no se utiliza el polimorfismo de C++, cuando se utiliza el puntero de clase base para llamar a la función correspondiente, siempre se limitará a la función de clase base en sí y no se podrán llamar funciones anuladas en la subclase. Debido a que no hay polimorfismo, la dirección de la llamada a la función será segura y la dirección fija siempre llamará a la misma función, lo que anula el propósito de "implementar una interfaz y múltiples implementaciones".

#include <iostream>
using namespace std;

class Base
{
public:
  virtual void func()
{
    cout << "Base::fun()" << endl;
  }
};

class Derived : public Base
{
public:
  virtual void func()
{
   cout << "Derived::fun()" << endl;
  }
};

int main()
{
  Base* b=new Derived;     //使用基类指针指向派生类对象
  b->func();               //动态绑定派生类成员函数func
  
  Base& rb=*(new Derived); //也可以使用引用指向派生类对象
  rb.func();        
}

        Salida del programa:

Derived::fun()
Derived::fun()

        Como se puede ver en el ejemplo anterior, cuando se utiliza un puntero de clase base o una referencia para señalar un objeto de subclase, la función llamada es una función reescrita en la subclase, lo que logra la vinculación dinámica de la dirección de la función de tiempo de ejecución, es decir, la vinculación dinámica. . . El polimorfismo dinámico se logra mediante "herencia + función virtual" Solo durante la ejecución del programa (no durante la compilación) se puede determinar el tipo real del objeto referenciado y llamar al método correspondiente de acuerdo con su tipo real. El formato específico es utilizar la palabra clave virtual para modificar una función miembro de una clase, lo que indica que la función es una función virtual y la clase derivada necesita volver a implementar la función miembro y el compilador implementará el enlace dinámico.


5. Resumen

        Formulario de aplicación:

        El polimorfismo estático es divergente, lo que permite utilizar el mismo código de implementación en diferentes situaciones.

        El polimorfismo dinámico es convergente, lo que permite utilizar diferentes códigos de implementación en la misma situación.

        En términos de pensamiento:

        El polimorfismo estático es un estilo de programación genérico que valora la universalidad de los algoritmos.

        El polimorfismo dinámico es un estilo de programación basado en objetos que valora la separación de interfaces e implementaciones.


↓↓↓ Para obtener más contenido técnico, libros y materiales, preste atención a "Clear Embedded" para intercambios técnicos en el grupo ↓↓↓ 

Supongo que te gusta

Origin blog.csdn.net/helloqusheng/article/details/133100991
Recomendado
Clasificación