Las soluciones a los ejercicios se pueden encontrar en el documento electrónico titulado «The Thinking in C++ Annotated Solution Guide», disponible por poco dinero en www.BruceEckel.com.
Modificar Car.cpp para que herede desde una clase llamada Vehicle, colocando correctamente las funciones miembro en Vehicle (esto es, añadir algunas funciones miembro). Añada un constructor (no el de por defecto) a Vehicle, que debe ser llamado desde dentro del constructor Car
Crear dos clases, A y B, con constructor por defectos notificándose ellos mismos. Una nueva clase llamada C que hereda de A, y cree un objeto miembro B dentro de C, pero no cree un constructor para C. Cree un objeto de la clase C y observe los resultados.
Crear una jerarquía de clases de tres niveles con constructores por defecto y con destructores, ambos notificándose utilizando cout. Verificar que el objeto más alto de la jerarquía, los tres constructores y destructores son ejecutados automáticamente. Explicar el orden en que han sido realizados.
Modificar Combined.cpp para añadir otro nivel de herencia y un nuevo objeto miembro. Añadir el código para mostrar cuando los constructores y destructores son ejecutados.
En Combined.cpp, crear una clase D que herede de B y que tenga un objeto miembro de la clase C. Añadir el código para mostrar cuando los constructores y los destructores son ejecutados.
Modificar Order.cpp para añadir otro nivel de herencia Derived3 con objetos miembro de la clase Member4 y Member5. Compruebe la salida del programa.
En NameHidding.cpp, verificar que Derived2, Derived3 y Derived4, ninguna versión de la clase base de f() esta disponible.
Modificar NameHiding.cpp añadiendo tres funciones sobrecargadas llamadas h() en Base y mostrar como redefiniendo una de ellas en una clase derivada oculta las otras.
Crear una clase StringVector que herede de vector<void*> y redefinir push_back y el operador [] para aceptar y producir string*. ¿Qué ocurre si intenta utilizar push_back() un void*?
Escribir una clase que contenga muchos tipos y utilice una llamada a una función pseudo-constructor que utiliza la misma sintaxis de un constructor.Utilizarla en el constructor para inicializar los tipos.
Crear una clase llamada Asteroid. Utilizar la herencia para especializar la clase PStash del capítulo 13 (PStash.h y PStash.cpp) para que la acepte y retorne punteros a Asteroid. También modifique PStashTest.cpp para comprobar sus clases. Cambiar la clase para que PStash sea un objeto miembro.
Repita el ejercicio 11 con un vector en vez de la clase PStash.
En SynthesizedFunctions.cpp, modifique Chess para proporcionarle un constructor por defecto, un constructor copia y un operador de asignación. Demostrar que han sido escritos correctamente.
Crear dos clases llamadas Traveler y Pager sin constructores por defecto, pero con constructores que toman un argumento del tipo string, el cual simplemente lo copia a una variable interna del tipo string. Para cada clase, escribir correctamente un constructor copia y el operador de asignación. Entonces cree la clase BusinessTraveler que hereda de Traveler y crear ub objeto miembro Pager dentro ella. Escribir correctamente el constructor por defecto, un constructor que tome una cadena como argumento, un constructor copia y un operador de asignación.
Crear una clase con dos funciones miembro estáticas. Herede de estas clases y redefina una de las funciones miembro. Mostrar que la otra función se oculta en la clase derivada.
Mejorar las funciones miembro de ifstream. En FName2.cpp, intentar suprimirlas del objeto file.
Utilice la herencia privada y protegida para crear dos nuevas clases desde la clase base. Intente convertir los objetos de las clases derivadas en la clase base. Explicar lo que ocurre.
En Protected.cpp, añadir una función miembro en Derived que llame al miembro protegido de Base read().
Cambiar Protected.cpp para que Derived utilice herencia protegida. Compruebe si puede llamar a value() desde un objeto Derived.
Crear una clase llamada SpaceShip con un metodo fly(). Crear Shuttle que hereda de SpaceShip y añadir el metodo land(). Creat un nuevo Shuttle, convertirlo por puntero o referenciaa SpaceShip e intente llamar al metodo land(). Explicar los resultados.
Modificar Instrument.cpp para añadir un método prepare() a Instrument. Llamar a prepare () dentro de tune().
Modificar Instrument.cpp para que play() muestre un mensaje con cout y que Wind redefina play() para que muestra un mensaje diferente con cout. Ejecute el programa y explique porque probamenteble no deseara esta conducta. Ahora ponga la palabra reservada virtual (la cual aprenderá en el capitulo 15) delante de de la declaración de play en Instrument y observe el cambio en el comportamiento.
En CopyConstructor.cpp, herede una nueva clase de Child y proporcionarle un miembro m. Escribir un constructor correcto, un constructor copia, operator= y operator<< de ostreams y comprobar la clase en main().
Tomar como ejemplo CopyConstructor.cpp y modifíquelo añadiendo su propio constructor copia a Child sin llamar el constructor copia de clase base y comprobar que ocurre. Arregle el problema añadiendo una llamada explicita al constructor copia de la clase base en la lista de inicialización del constructor del constructor copia de Child.
Modificar InheritStack2.cpp para utilizar un vector<string> en vez de Stack.
Crear una clase Rock con un constructor por defecto, un constructor copia y un operador de asignación y un destructor, todos ellos mostrándose para saber que han sido ejecutados. En main(), crear un vector<Rock> (esto es, tener objetos Rock por valor) y añadir varios Rocks. Ejecutar el programa y explicar los resultados obtenidos. Fijarse cuando los destructores son llamados desde los objetos Rock en el vector. Ahora repita el ejercicio con un vector<Rock*>. ¿Es posible crear un vector<Rock&>?
En este ejercicio cree un patrón de diseño llamado proxy. Comience con la clase base Subject y proporciónele tres funciones: f(), g() y h(). Ahora herede una clase Proxy y dos clases Implementation1 e Implementacion2 de Subject. Proxy tendría que contener un puntero a un Suboject y todos los miembros de Proxy (usualmente el constructor). En main(), crear dos objetos Proxy diferentes que usen las dos implementaciones diferentes. Modificar Proxy para que dinámicamente cambie las implementaciones.
Modificar ArrayOperatorNew del Capítulo 13 para mostrar que si deriva de Widget, la reserva de memoria todavía funciona correctamente. Explicar porque la herencia en Framis.cpp no funcionaria correctamente.
Modificar Framis.cpp del Capítulo 13 para que herede de Framis y crear nuevas versiones de new y delete para su clase derivada. Demostrar como todo ello funciona correctamente.