Complete las siguientes oraciones:
13.1 a) Tratar a un objeto de la clase base como un objeto de la clase derivada puede provocar errores lógicos. b) El polimorfismo ayuda a eliminar la lógica de switch.
c) Si una clase contiene al menos una función virtual pura, es una clase abstracta. d) Las clases a partir de las cuales pueden instanciarse objetos se llaman clases concretas. e) El operador dynamic_cast se puede usar para realizar conversiones descendentes con los apuntadores de la clase base en forma segura. f ) El operador typeid devuelve una referencia a un objeto type_info. g) El polimorfismo implica el uso de un apuntador o referencia de la clase base para invocar funciones virtual en objetos de la clase base y la clase derivada. h) Las funciones que pueden sobrescribirse se declaran mediante la palabra clave virtual.
i) Al proceso de convertir un apuntador de la clase base en un apuntador de la clase derivada se le conoce como conversión descendente. 13.2 Conteste con verdadero o falso a cada una de las siguientes proposiciones;
en caso de ser falso, explique por qué. a) Todas lasnes funciones virtual en una clase base abstracta se deben declarar virtual puras.…………………………………………………….( F ) como funcio R/= Falso. Una clase abstracta puede incluir funciones virtuales con implementaciones.
b) Es peligroso tratar de hacer referencia a un objeto de la clase derivada con un manejador de la clase base…………………………………………….………..( F )
R/= Falso. Es peligroso hacer referencia a un objeto de la clase base con un manejador de la clase derivada.
c) Para hacer a una clase abstract, se declara como virtual………..……….( F ) R/= Falso. Las clases nunca se declaran virtuales. En vez de ello, una clase se hace abstracta al incluir por lo menos una función virtual pura en ella.
d) Si una clase base declara a una función virtual pura, una clase derivada debe implementar la función para convertirse en una clase concreta…………….( V ) Verdadero.
e) La programación polimórfica puede eliminar la necesidad de la lógica de switch…………………………………………………………..…………………..( V ) Verdadero.
Ejercicios 13.3 ¿Cómo es que el polimorfismo le permite programar “en forma general”, en lugar de hacerlo “en forma específica”? Hable sobre las ventajas clave de la programación “en forma general”. El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma específica. En general nos sirve para programar objetos con características comunes y que todos estos compartan la misma superclase en una jerarquía de clases, como si todas fueran objetos de la superclase. Esto nos simplifica la programación.
13.4 Hable sobre los problemas de programar con la lógica de switch. Explique por qué el polimorfismo puede ser una alternativa efectiva al uso de la lógica de
switch. R/= - El programador podría olvidar incluir una prueba de tipos cuando sea obligatorio hacerla. - Podría olvidar evaluar todos los casos posibles en una instrucción switch. - Rastrear instrucciones puede ser un proceso que consuma mucho tiempo y esté propenso a errores. La programación polimórfica puede eliminar la necesidad de la lógica switch. Al utilizar el mecanismo polimórfico para realizar la lógica equivalente, los programadores pueden evitar el tipo de errores que se asoscian generalmente con la lógica de switch.
13.5 Explique la diferencia entre heredar la interfaz y heredar la implementación. ¿En qué difieren las jerarquías de herencia diseñadas para heredar la interfaz, de
las jerarquías diseñadas para heredar la implementación? R/= Toda herencia lo es de implementación, dado que todo en una clase base, interface e implantación, pasa a formar parte de la clase derivada. No es posible heredar solo una parte de una clase (es decir, la interface únicamente). La herencia de interfaces por otra parte, sólo añade declaraciones de miembros a la interfaz de la clase derivada, algo que no está soportado directamente en C++
13.6 ¿Qué son las funciones virtual? Describa una circunstancia en la que las
funciones virtual serían apropiadas. R/= Una función virtual o método virtual es una función cuyo comportamiento, al ser declarado "virtual", es determinado por la definición de una función con la misma cabecera en alguna de sus subclases. Por ejemplo, una clase base Animal podría tener una función virtual come. La subclase Pez implementaría de forma diferente que la subclase Lobo, pero se podría invocar a come() en cualquier instancia de una clase referida como Animal, y obtener el comportamiento de come() de la subclase específica.
13.7 Explique la diferencia entre la vinculación estática y la vinculación dinámica.
Explique el uso de las funciones virtual y la vtable en la vinculación dinámica. R/= Podemos declarar estáticas funciones y métodos. Variables pueden estar estáticas dentro de funciones, métodos, clases y a nivel global, es decir, por todas parte La vinculación dinámica requiere que en tiempo de ejecución, la llamada a una función miembro virtual se dirija a la versión de la función virtual apropiada para esa clase. La función vtable, se implementa como un arreglo que contiene apuntadores a funciones. Cada clase con funciones virtual tiene una vtable. Para cada función virtual en la clase, la vtable tiene una entrada que contiene un apuntador a función que apunta a la versión de la función virtual que se debe usar para un objeto de esa clase. La función virtual a utilizar para una clase específica podría ser la función definida en esa clase, o podría ser una función heredada ya sea de manera directa o indirecta de una clase base en un nivel más alto en la jerarquía.
13.8 Explique la diferencia entre las funciones virtual y las funciones virtual puras.
R/= Una función virtual o método virtual es una función cuyo comportamiento, al ser declarado "virtual", es determinado por la definición de una función con la misma cabecera en alguna de sus subclases. Una función virtual pura o método virtual puro es una función virtual que necesita ser implementada por una clase derivada que no sea abstracta.
13.9 Sugiera uno o más niveles de clases base abstractas para la jerarquía de Figura que vimos en este cap ítulo, y que se muestra en la fi gura 12.3. (El primer
nivel es Figura, y el segundo nivel consiste en las clases Figura Bidimensional y Figura Tridimensional.)
Clase abstracta FiguraBinomial: Rectangulo, equilatero Clase abstracta FiguraTridimensional: Exagono, ettagono.
13.10 ¿Cómo promueve el polimorfismo la extensibilidad? R/= Esta se lleva a cabo ya que el polimorfismo nos permite ampliar nuestros programas haciéndolos de manera simplificada pero a su vez de una forma extensa ya que permite que c on un solo paso realice múltiples opciones. 13.11 Se le ha pedido que desarrolle un simulador de vuelo que tenga salidas gráficas elaboradas. Explique por qué la progra mación polimórfica podría ser
especialmente efectiva para el problema de esta naturaleza. R/= Con el polimorfismo, una función puede ocasionar que ocurran distintas acciones, dependiendo del tipo del objeto que se invoca en la función.
13.12 (Modifique el sistema de nómina) Modifique el sistema de nómina de las
13.13 a 13.23 para incluir el miembro de datos privado llamado fechaNacimiento en la clase empleado. Use la clase Fecha de la figura 11.12 y 11.13 para representar el cumpleaños de un empleado. Suponga que la nómina se procesa una vez al mes. Cree un vector de referencias Empleado para guardar los diversos objetos empleado. En un ciclo, calcule la nómina para cada Empleado (mediante el polimorfismo) y agregue una bonificación de $.100.00 a la cantidad de pago de nómina de la persona, si el mes actual es el mes en el que ocurre el cumpleaños de ese Empleado. Adjunto encontrara el desarrollo
13.16 (Programa bancario polimórfico mediante el uso de la jerarquía Cuenta) Desarrolle un programa bancario polimórfico mediante el uso de la jerarquía
Cuenta creada en el ejercicio 12.10. Cree un vector de apuntadores Cuenta a objetos CuentaAhorros y CuentaCheques. Para cada Cuenta en el vector, permita al usuario especificar un monto de dinero a retira r de la Cuenta, usando la función miembro cargar, y un monto de dinero a depositar en la Cuenta mediante el uso de la función miembro abonar. A medida que procese cada Cuenta, determine su tipo. Si una Cuenta es una CuentaAhorros, calcule el monto de interés que se debe a la Cuenta usando la función miembro CalcularInteres, y después agregue el interés al saldo actual mediante la función miembro abonar. Después de procesar una Cuenta, imprima el saldo de la cuenta actualizado que se obtiene al invocar a la función miembro getSaldo de la clase base. Adjunto encontrara el desarrollo