






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Información sobre esto lo que es el binding dinámico y estático
Tipo: Apuntes
1 / 12
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
Es bien sabido que la Programación Orientada a Objetos es útil de muchas maneras en términos de la flexibilidad que brinda al crear clases, llamar a funciones, etc. Para entender que ocurre detrás de estas funciones, es necesario tener noción de los parámetros que se estudian a continuación.
Binding, que significa vinculación, se refiere a la vinculación entre la llamada a la función y la definición de la función. En su código, en cualquier momento cuando se llama a una función, el control del programa se vincula a la dirección en la memoria donde se ha definido la función. Ejemplo: Código C++ que demuestra el enlace: #include
Producción: m1 is invoked m2 is invoked Explicación: Supongamos que tenemos una clase A, que tiene dos funciones, m1 y m2 y sus definiciones. Entonces, para identificar para qué llamada de función en particular, qué función se ejecutará, se necesita binding, es decir, vinculación.
Static binding o enlace estático El enlace estático ocurre en tiempo de compilación, es decir, la llamada a la función y la definición de la función están vinculadas durante el tiempo de compilación. Por lo tanto, también se denomina vinculación anticipada. Esto se debe a que toda la información necesaria para asociar la llamada de función a su definición está disponible en el momento de la compilación. ¿Cuándo tiene lugar la unión estática?
Código C++ para demostrar el enlace estático: #include
En el código anterior, en la clase findSum(), vemos que la función sum() está sobrecargada. Hay dos definiciones de sum, y la única diferencia está en el número de parámetros pasados. Cuando llamamos a la misma función sum() desde el principal, se vincula a la definición correcta. Entonces, en este caso, en el momento de la compilación, la llamada a la función se vincula a la función correcta según los parámetros que se le hayan pasado. Dynamic binding o enlace dinámico El enlace dinámico tiene lugar durante el tiempo de ejecución en función del tipo de objeto. Dado que se retrasa hasta el tiempo de ejecución, también se denomina enlace tardío o enlace en tiempo de ejecución. Cuando el compilador no puede determinar toda la información necesaria para resolver una llamada de función durante el tiempo de compilación, estas llamadas de función no se vinculan hasta el tiempo de ejecución. ¿Cuándo tiene lugar el enlace dinámico? Se puede lograr con el uso de funciones virtuales en C++ y métodos anulados en Java. Ejemplo: Código Java para demostrar el enlace dinámico: class Human { // Overridden Method public void walk() { System.out.println("Human walks"); }
cout << "The base class function is called.\n"; } }; class D : public B { public: void f() //function overriding { cout << "The derived class function is called.\n"; } }; int main() { B base; // base class object D derived; //derived class object B *basePtr = &base; // base class pointer pointing to base class object basePtr->f(); //calls function of base class basePtr = &derived; // base class pointer pointing to object of derived class basePtr->f(); //calls function of derived class return 0; } Producción: The base class function is called. The derived class function is called. Explicación: En el ejemplo anterior, tenemos una clase base B en la que se ha declarado la función f() con la palabra clave "virtual". La clase derivada D hereda de la clase base B, lo que significa que todas las funciones miembro de la clase B también estarán disponibles en la clase D. Por lo tanto, la función f() de la clase B será accesible desde la clase D.
Pero vemos que la función f() ha sido definida nuevamente en la clase derivada. Ahora, en el código principal, tenemos un puntero de clase base basePtr. En primer lugar, apunta a un objeto de clase base "base", y la llamada de función basePtr->f() llama a la función f() de la clase base, que también se espera porque el puntero, así como el objeto al que apunta , son ambos del tipo clase base. Pero cuando basePtr apunta al objeto de clase derivada "derivado", es importante tener en cuenta que el puntero es de tipo clase base y el objeto al que apunta es de tipo clase derivada. La función llama a basePtr->f() que se resuelve en tiempo de ejecución y, por lo tanto, la función f() de la clase derivada se ejecuta ya que el objeto es de la clase derivada. Enlace estático vs Enlace dinámico Enlace estático Enlace dinámico Ocurre en el momento de la compilación. Sucede en el tiempo de ejecución. También se denomina vinculación anticipada. También se denomina enlace tardío. Cuando toda la información necesaria para llamar a una función está disponible en el momento de la compilación, se produce un enlace estático. Cuando el compilador no puede determinar toda la información para resolver la llamada de función, se produce un enlace dinámico. Se puede lograr durante las llamadas de funciones normales, la sobrecarga de funciones y la sobrecarga de operadores. Se logra con el uso de funciones virtuales. La ejecución se vuelve más rápida que el enlace dinámico porque la llamada a la función se resuelve antes del tiempo de ejecución. Como la llamada de función se resuelve en tiempo de ejecución, a veces conduce a una ejecución de código más lenta. Proporciona menos flexibilidad en comparación con la unión dinámica. Proporciona más flexibilidad, ya que se pueden manejar diferentes tipos de objetos en tiempo de ejecución mediante una sola llamada de función, lo que hace que el código fuente sea más legible. El concepto de Binding está íntimamente relacionado con el concepto de ámbito scope (que significa alcance), ya que el análisis de ámbito es la determinación de las relaciones de binding. El Scope es un contexto de ejecución de código que determina que ciertas variables sean accesibles, mientras que otras no. Para que una variable esté disponible para su uso, deberá estar en el scope o alcance desde el cual se intenta acceder a ella. Existen dos tipos de scope:
Ventajas Desventajas Es fácil razonar sobre el alcance de las variables en un programa, porque se determina en tiempo de compilación. Puede ser más difícil escribir y depurar programas porque el alcance de las variables puede ser menos flexible. Puede conducir a una ejecución más rápida porque el alcance de las variables se puede determinar en tiempo de compilación, lo que elimina la necesidad de realizar búsquedas en tiempo de ejecución. Puede ser más difícil escribir código que sea reutilizable, porque solo se puede acceder a las variables dentro de su ámbito definido. Es menos propenso a errores porque solo se puede acceder a las variables dentro de su ámbito definido. El alcance estático no es adecuado para implementar características dinámicas como el alcance dinámico o los cierres, que requieren un enfoque más flexible para el alcance variable. Dado que el alcance estático permite que el compilador determine el alcance de las variables en tiempo de compilación, puede optimizar el código eliminando búsquedas de variables innecesarias. El alcance estático puede dificultar el logro de la encapsulación, un principio fundamental de la programación orientada a objetos. La encapsulación permite una mejor organización del código, mejora la legibilidad del código y facilita el
La eliminación de las búsquedas en tiempo de ejecución debido al alcance estático puede resultar en una ejecución más rápida del programa, lo que lleva a un mejor rendimiento El alcance estático puede generar colisiones de espacios de nombres, donde las variables en diferentes alcances tienen el mismo nombre, lo que genera confusión y errores.
del programa. El alcance estático evita la modificación accidental o intencional de variables fuera de su alcance, lo que hace que el programa sea más seguro de ejecutar. Dado que el alcance estático facilita el razonamiento sobre el alcance de las variables en un programa, puede hacer que el mantenimiento y la depuración del programa consuman menos tiempo y sean menos propensos a errores.
Ventajas Desventajas Es más flexible, porque se puede acceder a las variables desde cualquier parte del programa. Puede ser más difícil razonar sobre el alcance de las variables en un programa porque se determina en tiempo de ejecución. Puede ser más fácil escribir código que sea reutilizable, porque se puede acceder a las variables desde cualquier lugar. Puede conducir a una ejecución más lenta porque el alcance de las variables solo se puede determinar en tiempo de ejecución, lo que requiere búsquedas adicionales. El alcance dinámico puede facilitar la depuración de ciertos tipos de código, como funciones recursivas o código con flujo de control complejo. Esto se debe a que se puede acceder a las variables desde cualquier parte del programa, lo que facilita el seguimiento de sus valores y comportamiento. Puede ser más propenso a errores porque se puede acceder a las variables desde lugares inesperados. Permite que el código se adapte más fácilmente a los requisitos o circunstancias cambiantes. Esto se debe a que se puede acceder a las variables desde cualquier parte del programa, lo que permite una mayor flexibilidad en el alcance de las variables.