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 442 — #480<br />
✐<br />
Capítulo 15. Polimorfismo y Funciones virtuales<br />
clase con funciones virtuales el compilador coloca de forma secreta un puntero llamado<br />
vpointer (de forma abreviada VPTR), que apunta a la VTABLE de ese objeto.<br />
Cuando se hace una llamada a una función virtual a través de un puntero a la clase<br />
base (es decir, cuando se hace una llamada usando el polimorfismo), el compilador<br />
sil<strong>en</strong>ciosam<strong>en</strong>te añade código para buscar el VPTR y así conseguir la dirección de<br />
la función <strong>en</strong> la VTABLE, con lo que se llama a la función correcta y ti<strong>en</strong>e lugar la<br />
ligadura dinámica.<br />
Todo esto - establecer la VTABLE para cada clase, inicializar el VPTR, insertar<br />
código para la llamada a la función virtual - sucede automáticam<strong>en</strong>te sin que haya<br />
que preocuparse por ello. Con las funciones virtuales, se llama a la función apropiada<br />
de un objeto, incluso aunque el compilador no sepa el tipo exacto del objeto.<br />
15.5.1. Almac<strong>en</strong>ando información de tipo<br />
Se puede ver que no hay almac<strong>en</strong>ada información de tipo de forma explícita <strong>en</strong><br />
ninguna de las clases. Pero los ejemplos anteriores, y la simple lógica, dic<strong>en</strong> que debe<br />
existir algún tipo de información almac<strong>en</strong>ada <strong>en</strong> los objetos; de otra forma el tipo no<br />
podría ser establecido <strong>en</strong> tiempo de ejecución. Es verdad, pero la información de tipo<br />
está oculta. Para verlo, aquí está un ejemplo que muestra el tamaño de las clases que<br />
usan funciones virtuales comparadas con aquellas que no las usan:<br />
//: C15:Sizes.cpp<br />
// Object sizes with/without virtual functions<br />
#include <br />
using namespace std;<br />
class NoVirtual {<br />
int a;<br />
public:<br />
void x() const {}<br />
int i() const { return 1; }<br />
};<br />
class OneVirtual {<br />
int a;<br />
public:<br />
virtual void x() const {}<br />
int i() const { return 1; }<br />
};<br />
class TwoVirtuals {<br />
int a;<br />
public:<br />
virtual void x() const {}<br />
virtual int i() const { return 1; }<br />
};<br />
int main() {<br />
cout