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

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

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

Saved successfully!

Ooh no, something went wrong!