Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO
✐ ✐ ✐ “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
- Page 423 and 424: ✐ ✐ ✐ “Volumen1” — 2012
- Page 425 and 426: ✐ ✐ ✐ “Volumen1” — 2012
- Page 427 and 428: ✐ ✐ ✐ “Volumen1” — 2012
- Page 429 and 430: ✐ ✐ ✐ “Volumen1” — 2012
- Page 431 and 432: ✐ ✐ ✐ “Volumen1” — 2012
- Page 433 and 434: ✐ ✐ ✐ “Volumen1” — 2012
- Page 435 and 436: ✐ ✐ ✐ “Volumen1” — 2012
- Page 437 and 438: ✐ ✐ ✐ “Volumen1” — 2012
- Page 439 and 440: ✐ ✐ ✐ “Volumen1” — 2012
- Page 441 and 442: ✐ ✐ ✐ “Volumen1” — 2012
- Page 443 and 444: ✐ ✐ ✐ “Volumen1” — 2012
- Page 445 and 446: ✐ ✐ ✐ “Volumen1” — 2012
- Page 447 and 448: ✐ ✐ ✐ “Volumen1” — 2012
- Page 449 and 450: ✐ ✐ ✐ “Volumen1” — 2012
- Page 451 and 452: ✐ ✐ ✐ “Volumen1” — 2012
- Page 453 and 454: ✐ ✐ ✐ “Volumen1” — 2012
- Page 455 and 456: ✐ ✐ ✐ “Volumen1” — 2012
- Page 457 and 458: ✐ ✐ ✐ “Volumen1” — 2012
- Page 459 and 460: ✐ ✐ ✐ “Volumen1” — 2012
- Page 461 and 462: ✐ ✐ ✐ “Volumen1” — 2012
- Page 463 and 464: ✐ ✐ ✐ “Volumen1” — 2012
- Page 465 and 466: ✐ ✐ ✐ “Volumen1” — 2012
- Page 467 and 468: ✐ ✐ ✐ “Volumen1” — 2012
- Page 469 and 470: ✐ ✐ ✐ “Volumen1” — 2012
- Page 471 and 472: ✐ ✐ ✐ “Volumen1” — 2012
- Page 473: ✐ ✐ ✐ “Volumen1” — 2012
- Page 477 and 478: ✐ ✐ ✐ “Volumen1” — 2012
- Page 479 and 480: ✐ ✐ ✐ “Volumen1” — 2012
- Page 481 and 482: ✐ ✐ ✐ “Volumen1” — 2012
- Page 483 and 484: ✐ ✐ ✐ “Volumen1” — 2012
- Page 485 and 486: ✐ ✐ ✐ “Volumen1” — 2012
- Page 487 and 488: ✐ ✐ ✐ “Volumen1” — 2012
- Page 489 and 490: ✐ ✐ ✐ “Volumen1” — 2012
- Page 491 and 492: ✐ ✐ ✐ “Volumen1” — 2012
- Page 493 and 494: ✐ ✐ ✐ “Volumen1” — 2012
- Page 495 and 496: ✐ ✐ ✐ “Volumen1” — 2012
- Page 497 and 498: ✐ ✐ ✐ “Volumen1” — 2012
- Page 499 and 500: ✐ ✐ ✐ “Volumen1” — 2012
- Page 501 and 502: ✐ ✐ ✐ “Volumen1” — 2012
- Page 503 and 504: ✐ ✐ ✐ “Volumen1” — 2012
- Page 505 and 506: ✐ ✐ ✐ “Volumen1” — 2012
- Page 507 and 508: ✐ ✐ ✐ “Volumen1” — 2012
- Page 509 and 510: ✐ ✐ ✐ “Volumen1” — 2012
- Page 511 and 512: ✐ ✐ ✐ “Volumen1” — 2012
- Page 513 and 514: ✐ ✐ ✐ “Volumen1” — 2012
- Page 515 and 516: ✐ ✐ ✐ “Volumen1” — 2012
- Page 517 and 518: ✐ ✐ ✐ “Volumen1” — 2012
- Page 519 and 520: ✐ ✐ ✐ “Volumen1” — 2012
- Page 521 and 522: ✐ ✐ ✐ “Volumen1” — 2012
- Page 523 and 524: ✐ ✐ ✐ “Volumen1” — 2012
✐<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