Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 420 — #458<br />
✐<br />
Capítulo 14. Her<strong>en</strong>cia y Composición<br />
Una segunda manera es añadir la definición Close() a FName1:<br />
void close() { file.close(); }<br />
Esto funcionará si sólo exist<strong>en</strong> unas cuantas funciones a las que se desea hacer<br />
funcionar como una clase ifstream. En este caso, solo una parte de la clase y la composición<br />
apropiada.<br />
Pero ¿qué ocurre si se quiere que todo funcione cómo la clase deseada A eso se le<br />
llama subtipos porque esta creando un nuevo tipo desde uno ya exist<strong>en</strong>te y lo que se<br />
quiere es que el nuevo tipo t<strong>en</strong>ga la misma interfaz que el tipo exist<strong>en</strong>te (además de<br />
otras funciones que se dese<strong>en</strong> añadir) para que se pueda utilizar <strong>en</strong> cualquier lugar<br />
donde se utilizaba el tipo exist<strong>en</strong>te. Aquí es dónde la her<strong>en</strong>cia es es<strong>en</strong>cial. Puede ver<br />
que el subtipo resuelve perfectam<strong>en</strong>te el problema anterior:<br />
//: C14:FName2.cpp<br />
// Subtyping solves the problem<br />
#include "../require.h"<br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
class FName2 : public ifstream {<br />
string fileName;<br />
bool named;<br />
public:<br />
FName2() : named(false) {}<br />
FName2(const string& fname)<br />
: ifstream(fname.c_str()), fileName(fname) {<br />
assure(*this, fileName);<br />
named = true;<br />
}<br />
string name() const { return fileName; }<br />
void name(const string& newName) {<br />
if(named) return; // Don’t overwrite<br />
fileName = newName;<br />
named = true;<br />
}<br />
};<br />
int main() {<br />
FName2 file("FName2.cpp");<br />
assure(file, "FName2.cpp");<br />
cout