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

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

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 436 — #474 ✐ Capítulo 15. Polimorfismo y Funciones virtuales compilador. Usted se puede encontrar atascado en el nivel de "programación basada en objetos" debido a que es de fácil acceso y no requiere mucho esfuerzo mental. Es también sencillo sentir cómo está creando tipos de datos - usted hace clases y objetos, envía mensajes a esos objetos, y todo es bonito y pulcro. Pero no sea tonto. Si se para aquí, se está perdiendo una de las más importantes partes del lenguaje, que significa el salto a la verdadera programación orientada a objetos. Y esto se consigue únicamente con las funciones virtuales. Las funciones virtuales realzan el concepto de tipo en lugar de simplemente encapsular código dentro de estructuras y dejarlo detrás de un muro, por lo que son, sin lugar a dudas, el concepto más difícil a desentrañar por los nuevos programadores en C++. Sin embargo, son también el punto decisivo para comprender la programación orientada a objetos. Si no usa funciones virtuales, todavía no entiende la POO. Debido a que las funciones virtuales están intimamente unidas al concepto de tipo, y los tipos son el núcleo de la programación orientada a objetos, no existe analogía a las funciones virtuales dentro de los lenguajes procedurales. Como programador procedural, usted no tiene referente con el que comparar las funciones virtuales, al contrario de las otras características del lenguaje. Las características de un lenguaje procedural pueden ser entendidas en un nivel algorítmico, pero las funciones virtuales deben ser entendidas desde el punto de vista del diseño. 15.2. Upcasting En el Capítulo 14 se vió como un objeto puede ser usado como un objeto de su propio tipo o como un objeto de su tipo base. Además el objeto puede ser manejado a través de su tipo base. Tomar la dirección de un objeto (o un puntero o una referencia) y tratarlo como la dirección de su tipo base se conoce como upcasting 1 debido al camino que se genera en los árboles de herencia que se suelen pintar con la clase base en la cima. También se vió surgir un problema el cuál está encarnado en el siguiente código: //: C15:Instrument2.cpp // Inheritance & upcasting #include using namespace std; enum note { middleC, Csharp, Eflat }; // Etc. class Instrument { public: void play(note) const { cout

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 437 — #475 ✐ 15.3. El problema public: // Redefine interface function: void play(note) const { cout

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 436 — #474<br />

✐<br />

Capítulo 15. Polimorfismo y Funciones virtuales<br />

compilador.<br />

Usted se puede <strong>en</strong>contrar atascado <strong>en</strong> el nivel de "programación basada <strong>en</strong> objetos"<br />

debido a que es de fácil acceso y no requiere mucho esfuerzo m<strong>en</strong>tal. Es también<br />

s<strong>en</strong>cillo s<strong>en</strong>tir cómo está creando tipos de datos - usted hace clases y objetos, <strong>en</strong>vía<br />

m<strong>en</strong>sajes a esos objetos, y todo es bonito y pulcro.<br />

Pero no sea tonto. Si se para aquí, se está perdi<strong>en</strong>do una de las más importantes<br />

partes del l<strong>en</strong>guaje, que significa el salto a la verdadera programación ori<strong>en</strong>tada a<br />

objetos. Y esto se consigue únicam<strong>en</strong>te con las funciones virtuales.<br />

Las funciones virtuales realzan el concepto de tipo <strong>en</strong> lugar de simplem<strong>en</strong>te <strong>en</strong>capsular<br />

código d<strong>en</strong>tro de estructuras y dejarlo detrás de un muro, por lo que son, sin<br />

lugar a dudas, el concepto más difícil a des<strong>en</strong>trañar por los nuevos programadores<br />

<strong>en</strong> <strong>C++</strong>. Sin embargo, son también el punto decisivo para compr<strong>en</strong>der la programación<br />

ori<strong>en</strong>tada a objetos. Si no usa funciones virtuales, todavía no <strong>en</strong>ti<strong>en</strong>de la POO.<br />

Debido a que las funciones virtuales están intimam<strong>en</strong>te unidas al concepto de<br />

tipo, y los tipos son el núcleo de la programación ori<strong>en</strong>tada a objetos, no existe analogía<br />

a las funciones virtuales d<strong>en</strong>tro de los l<strong>en</strong>guajes procedurales. Como programador<br />

procedural, usted no ti<strong>en</strong>e refer<strong>en</strong>te con el que comparar las funciones virtuales,<br />

al contrario de las otras características del l<strong>en</strong>guaje. Las características de un l<strong>en</strong>guaje<br />

procedural pued<strong>en</strong> ser <strong>en</strong>t<strong>en</strong>didas <strong>en</strong> un nivel algorítmico, pero las funciones<br />

virtuales deb<strong>en</strong> ser <strong>en</strong>t<strong>en</strong>didas desde el punto de vista del diseño.<br />

15.2. Upcasting<br />

En el Capítulo 14 se vió como un objeto puede ser usado como un objeto de su<br />

propio tipo o como un objeto de su tipo base. Además el objeto puede ser manejado a<br />

través de su tipo base. Tomar la dirección de un objeto (o un puntero o una refer<strong>en</strong>cia)<br />

y tratarlo como la dirección de su tipo base se conoce como upcasting 1 debido al<br />

camino que se g<strong>en</strong>era <strong>en</strong> los árboles de her<strong>en</strong>cia que se suel<strong>en</strong> pintar con la clase<br />

base <strong>en</strong> la cima.<br />

También se vió surgir un problema el cuál está <strong>en</strong>carnado <strong>en</strong> el sigui<strong>en</strong>te código:<br />

//: C15:Instrum<strong>en</strong>t2.cpp<br />

// Inheritance & upcasting<br />

#include <br />

using namespace std;<br />

<strong>en</strong>um note { middleC, Csharp, Eflat }; // Etc.<br />

class Instrum<strong>en</strong>t {<br />

public:<br />

void play(note) const {<br />

cout

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

Saved successfully!

Ooh no, something went wrong!