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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<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!