13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!