Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 439 — #477<br />
✐<br />
15.4. Funciones virtuales<br />
};<br />
void tune(Instrum<strong>en</strong>t& i) {<br />
// ...<br />
i.play(middleC);<br />
}<br />
int main() {<br />
Wind flute;<br />
tune(flute); // Upcasting<br />
} ///:~<br />
Este archivo es idéntico a Instrum<strong>en</strong>t2.cpp excepto por la adición de la palabra<br />
reservada virtual y, sin embargo, el comportami<strong>en</strong>to es significativam<strong>en</strong>te<br />
difer<strong>en</strong>te: Ahora la salida es Wind::play.<br />
15.4.1. Ext<strong>en</strong>sibilidad<br />
Con play() definido como virtual <strong>en</strong> la clase base, se pued<strong>en</strong> añadir tantos<br />
nuevos tipos como se quiera sin cambiar la función play(). En un programa<br />
ori<strong>en</strong>tado a objetos bi<strong>en</strong> diseñado, la mayoría de las funciones seguirán el modelo<br />
de play() y se comunicarán únicam<strong>en</strong>te a través de la interfaz de la clase base. Las<br />
funciones que us<strong>en</strong> la interfaz de la clase base no necesitarán ser cambiadas para<br />
soportar a las nuevas clases.<br />
Aquí está el ejemplo de los instrum<strong>en</strong>tos con más funciones virtuales y un mayor<br />
número de nuevas clases, las cuales trabajan de manera correcta con la antigua (sin<br />
modificaciones) función play():<br />
//: C15:Instrum<strong>en</strong>t4.cpp<br />
// Ext<strong>en</strong>sibility in OOP<br />
#include <br />
using namespace std;<br />
<strong>en</strong>um note { middleC, Csharp, Cflat }; // Etc.<br />
class Instrum<strong>en</strong>t {<br />
public:<br />
virtual void play(note) const {<br />
cout