Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 476 — #514<br />
✐<br />
Capítulo 15. Polimorfismo y Funciones virtuales<br />
virtual y una llamada no virtual. Será necesario realizar multiples llamadas a<br />
cada función para poder ver la difer<strong>en</strong>cia.<br />
21. Modifique C14:Order.cpp añadi<strong>en</strong>do una función virtual <strong>en</strong> la clase base<br />
de la macro CLASS (que pinte algo) y haci<strong>en</strong>do el destructor virtual. Cree objetos<br />
de las distintas subclases y hagales un upcast a la clase base. Verifique<br />
que el comportami<strong>en</strong>to virtual funciona y que se realiza de forma correcta la<br />
construcción y la destrucción del objeto.<br />
22. Escriba una clase con tres funciones virtuales sobrecargadas. Herede una nueva<br />
clase y sobreescriba una de las funciones. Cree un objeto de la clase derivada.<br />
¿Se puede llamar a todas las funciones de la clase base a través del objeto<br />
derivado Haga un upcast de la dirección del objeto a la base. ¿Se pued<strong>en</strong> llamar<br />
a las tres funciones a través de la base Elimine la definición sobreescrita<br />
<strong>en</strong> la clase derivada. Ahora ¿Se puede llamar a todas las funciones de la clase<br />
base a través del objeto derivado.<br />
23. Modifique VariantReturn.cpp para que muestre que su comportami<strong>en</strong>to<br />
funciona con refer<strong>en</strong>cias igual que con punteros.<br />
24. En Early.cpp, ¿Cómo se le puede indicar al compilador que haga la llamada<br />
usando ligadura estática o ligadura dinámica Determine el caso para su<br />
propio compilador.<br />
25. Cree una clase base que cont<strong>en</strong>ga una función clone() que devuelva un puntero<br />
a una copia del objeto actual. Derive dos subclases que sobreescriban clone()<br />
para devolver copias de sus tipos específicos. En el main(), cree y haga<br />
upcast de sus dos tipos derivados, y llame a clone() para cada uno y verifique<br />
que las copias clonadas son de los subtipos correctos. Experim<strong>en</strong>te con su<br />
función clone() para que se pueda ir al tipo base, y después int<strong>en</strong>te regresar<br />
al tipo exacto derivado. ¿Se le ocurre alguna situación <strong>en</strong> la que sea necesario<br />
esta aproximación<br />
26. Modifique OStackTest.cpp creando su propia clase, después haga multiple<br />
her<strong>en</strong>cia con Object para crear algo que pueda ser introducido <strong>en</strong> la pila.<br />
Pruebe su clase <strong>en</strong> el main().<br />
27. Añada un tipo llamado T<strong>en</strong>sor a OperartorPolymorphism.cpp.<br />
28. (Intermedio) Cree una clase base X sin datos miembro y sin constructor, pero<br />
con una función virtual. Cree una Y que herede de X, pero sin un constructor<br />
explícito. G<strong>en</strong>ere código <strong>en</strong>samblador y examinelo para deteriminar si se crea<br />
y se llama un constructor de X y, si eso ocurre, qué código lo hace. Explique lo<br />
que haya descubierto. X no ti<strong>en</strong>e constructor por defecto, <strong>en</strong>tonces ¿por qué no<br />
se queja el compilador<br />
29. (Intermedio) Modifique el Ejercicio 28 escribi<strong>en</strong>do constructores para ambas<br />
clases de tal forma que cada constructor llame a una función virtual. G<strong>en</strong>ere el<br />
código <strong>en</strong>samblador. Determine donde se <strong>en</strong>cu<strong>en</strong>tra asignado el VPTR d<strong>en</strong>tro<br />
del constructor. ¿El compilador está usando el mecanismo virtual d<strong>en</strong>tro del<br />
constructor Explique por qué se sigue usando la version local de la función.<br />
30. (Avanzado) Si una función llama a un objeto pasado por valor si ligadura estática,<br />
una llamada virtual accede a partes que no exist<strong>en</strong>. ¿Es posible Escriba<br />
un código para forzar una llamada virtual y vea si se produce un cuelgue de la<br />
aplicación. Para explicar el comportami<strong>en</strong>to, observe que ocurre si se pasa un<br />
objeto por valor.<br />
476<br />
✐<br />
✐<br />
✐<br />
✐