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

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

Saved successfully!

Ooh no, something went wrong!