tipos sencillos qué poo polimorfismo polimorficos parametrico orientado objetos metodos ejemplos ejemplo c++ binding

c++ - sencillos - ¿Cuál es la diferencia entre el polimorfismo de tiempo de compilación y el enlace estático?



qué es el polimorfismo en la poo (5)

Este enlace me ayudó a entender la diferencia entre el enlace estático y el enlace dinámico. pero estoy en una confusión que

cuál es la diferencia entre el enlace estático y el polimorfismo de tiempo de compilación o no hay diferencia .

Esto también crea una duda sobre el enlace dinámico y el polimorfismo de tiempo de ejecución?


En breve

La vinculación estática vs dinámica se trata cuando se conoce el código exacto para ejecutar (es decir, la dirección de la función): en compilación, enlace (ambos "estáticos"), carga o tiempo de ejecución (ambos "dinámicos").

El polimorfismo es, en primer lugar, sobre cómo se conoce el código exacto para ejecutar: para calificar como polimorfismo, se deduce necesariamente del tipo de datos que se procesan. Cuando el "tipo dinámico" de datos no se conoce hasta el tiempo de ejecución (a menudo porque el tipo está determinado por las entradas de datos de tiempo de ejecución) debe usarse el enlace dinámico, y eso requiere polimorfismo dinámico (también conocido como polimorfismo de tiempo de ejecución; C ++ ofrece el despacho virtual mecanismo en esta categoría). Existen otras situaciones en las que el despacho virtual es útil aunque los tipos de datos que se procesan estén disponibles en tiempo de compilación, especialmente para minimizar / eliminar los tiempos de compilación después de los cambios de código, y para ajustar el código "inflado". De todos modos, el polimorfismo estático conocido como tiempo de compilación utiliza lo que se conoce sobre los tipos en el momento de la compilación para enlazar en tiempo de compilación o enlace (es decir, "estáticamente").

Ejemplos

struct Base { virtual void f(); void g(); }; struct Derived : Base { void f(); void g(); }; Derived d; d.f(); // if definition''s in a shared library, needs dynamic binding // otherwise (same translation unit, linked object, static lib) // compiler should optimise to static binding // (though functionally either would work) Base* p = factory(data); p->f(); // dynamic binding - if p points to a Base, use Base::f() // - if p pointer to a Derived, use Derived::f() void some_func(const char*); // note: no polymorphism / overloads some_func("hello world/n"); // if some_func is defined in... // - shared / dynamic link library, binds dynamically // - otherwise, static binding std::cout << "hello world/n"; // static binding // compile-time polymorphism from (operator) overloading

Discusión

La vinculación normalmente se refiere al momento en que el programa resuelve una llamada de función al código máquina de la implementación de una función específica:

  • estático significa que esto sucede durante la compilación

  • dinámico significa que esto sucede cuando se ejecuta / ejecuta el programa ejecutable

"binding" - y "currying" - también se usan para describir la estipulación de argumentos a los funtores (busque "binding" en las preguntas frecuentes de Stroustrup C ++ 11 )

Las únicas situaciones en las que los programas C ++ enlazan dinámicamente llamadas de función son:

  • cuando se utiliza una biblioteca dinámica, en cuyo caso la vinculación puede ser realizada por el cargador de sistemas operativos antes de llamar a main() , o explícitamente en código usando dlsym (o función específica del sistema operativo), que devuelve un puntero de función para usar llamar a una función que se encuentra en una biblioteca dinámica (.so, .dll, ...).

  • en despacho virtual, cuando se encuentra una función de miembro virtual en tiempo de ejecución, generalmente siguiendo un puntero desde el objeto de datos a una tabla de despacho virtual donde se registra el puntero de la función

  • cuando los punteros a las funciones son utilizados explícitamente por el programador

En otras situaciones, el enlace es estático: el compilador escribe una jmp o una llamada a una dirección / desplazamiento de memoria específica (independientemente de si el contador de programa no tiene importancia o relativo) en el objeto o ejecutable que crea, y eso no se modifica durante la carga o ejecución del programa.

La clasificación de enlace estático / dinámico solo tiene una pequeña superposición con el polimorfismo:

  • El despacho virtual normalmente usa enlace dinámico (pero a veces se puede optimizar según los ejemplos anteriores) y

  • todas las otras formas de polimorfismo en C ++ (es decir, sobrecarga, plantillas, macro expansiones en línea) utilizan enlaces estáticos, pero

  • también lo hace la mayoría del código no polimórfico: cualquier llamada no virtual "normal" a una función que no está en una biblioteca compartida / dinámica se resuelve también en tiempo de compilación.


El polimorfismo de tiempo de compilación es bastante vago y contradictorio. El polimorfismo se usa para llamar a un método específico basado en el tipo de objeto en tiempo de ejecución. Está íntimamente relacionado con el enlace tardío o el enlace dinámico. Lo logra usando la palabra clave virtual :

class Base { virtual void do() // Note the virtual { cout << "Base" << endl; } }; class Derived : public Base { virtual void do() { cout << "Derived" << endl; } }; void use(Base& b) { b.do(); // There you have late binding with ''virtual'' // If you remove ''virtual'', you have early binding, // Base::do() will be called everytime } Base b; Derived d; use(b); // print Base use(d); // print Derived, but print Base if you do not use virtual in Base.

La sobrecarga de funciones es solo azúcar sintáctica, no relacionada con el polimorfismo. Puedes usarlo para escribir:

void use(int); void use(MyClass&); void use(const std::string&);

en lugar de:

void useInteger(int); void useMyClass(MyClass&); void useString(const std::string&);

Como puede usar esto con métodos, puede creer que está relacionado con el polimorfismo. ¡Ten en cuenta que no se combina bien con el polimorfismo!

Con respecto al polimorfismo estático, el término se usa alguna vez para describir un patrón utilizado con plantillas que imitan el polimorfismo en el momento de la compilación: vea CRTP o Curriously Reccuring Template Pattern


El polimorfismo se refiere a la capacidad de un objeto para comportarse de manera diferente al mismo mensaje.

El polimorfismo es de dos tipos. estático o dinámico En el polimorfismo dinámico, la respuesta al mensaje se decide en el tiempo de ejecución, mientras que en el polimorfismo estático se decide en tiempo de compilación.

La asignación de tipos de datos en el polimorfismo dinámico se conoce como enlace tardío o dinámico. En el método de enlace dinámico, la llamada se produce en función del tipo de objeto (instancia) en el tiempo de ejecución. Por ejemplo: anulación de método

Si la asignación de tipos de datos está en tiempo de compilación, se conoce como enlace anticipado o estático. En el método de enlace estático, la llamada se produce en función del tipo de referencia en el momento de la compilación. Ejemplo: sobrecarga de método

Sobrecarga de método: esto significa crear un nuevo método con el mismo nombre y firma diferente. Utiliza enlace temprano.

Anulación de método: este es el proceso de dar una nueva definición para un método existente en su clase secundaria. Todos los objetos creados en el tiempo de ejecución en el montón, por lo tanto, el enlace real se realiza solo en el tiempo de ejecución.


La diferencia es que primero es la técnica (enlace) y la segunda es la característica (polimorfismo) que se puede utilizar en función de esta técnica.

Polimorfismo significa escribir código general para trabajar con diferentes objetos sin conocer sus tipos exactos.

La vinculación estática es una propiedad de lenguaje que permite al compilador resolver el tipo llamado en tiempo de compilación. Pero puede haber unión estática sin polimorfismo.

La vinculación dinámica es una propiedad de lenguaje que permite decidir sobre el tipo en tiempo de ejecución. Pero puede haber unión dinámica sin polimorfismo. Si se utiliza el enlace dinámico para escribir código general que funciona con objetos de varias clases en jerarquía, entonces será un polimorfismo dinámico.


La diferencia importante es cuando se muestra el error si ocurrió. Si tiene enlace estático, es posible detectar un error en el momento de la compilación. El error de tiempo de ejecución es más difícil de encontrar.