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 450 — #488<br />

✐<br />

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

función <strong>en</strong> una clase sea declarada como virtual pura, la VTABLE estará incompleta.<br />

Si la VTABLE de una clase está incompleta, ¿qué se supone que debe hacer el<br />

compilador cuando algui<strong>en</strong> int<strong>en</strong>te crear un objeto de esa clase No sería seguro<br />

crear un objeto de esa clase abstracta, por lo que se obt<strong>en</strong>dría un error de parte del<br />

compilador. Dicho de otra forma, el compilador garantiza la pureza de una clase<br />

abstracta. Hacer clases abstractas asegura que el programador cli<strong>en</strong>te no puede hacer<br />

mal uso de ellas.<br />

Aquí t<strong>en</strong>emos Instrum<strong>en</strong>t4.cpp modificado para usar funciones virtuales puras.<br />

Debido a que la clase no ti<strong>en</strong>e otra cosa que no sea funciones virtuales, se la<br />

llama clase abstracta pura:<br />

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

// Pure abstract base classes<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 />

// Pure virtual functions:<br />

virtual void play(note) const = 0;<br />

virtual char* what() const = 0;<br />

// Assume this will modify the object:<br />

virtual void adjust(int) = 0;<br />

};<br />

// Rest of the file is the same ...<br />

class Wind : public 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!