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 453 — #491<br />

✐<br />

15.8. Her<strong>en</strong>cia y la VTABLE<br />

15.8. Her<strong>en</strong>cia y la VTABLE<br />

Es fácil imaginar lo que sucede cuando hay her<strong>en</strong>cia y se sobreescrib<strong>en</strong> algunas<br />

de las funciones virtuales. El compilador crea una nueva VTABLE para la nueva<br />

clase, e inserta las nuevas direcciones de las funciones usando además las direcciones<br />

de las funciones de la clase base para aquellas funciones virtuales que no se hayan<br />

sobreescrito. De un modo u otro, para todos los objetos que se puedan crear (es decir,<br />

aquellos que no t<strong>en</strong>gan funciones virtuales puras) existe un conjunto completo de<br />

direcciones de funciones <strong>en</strong> la VTABLE, por lo que será imposible hacer llamadas a<br />

una dirección que no esté <strong>en</strong> la VTABLE (lo cual sería desastroso).<br />

Pero ¿qué ocurre cuando se hereda y añade una nueva función virtual <strong>en</strong> la clase<br />

derivada Aquí hay un s<strong>en</strong>cillo ejemplo:<br />

//: C15:AddingVirtuals.cpp<br />

// Adding virtuals in derivation<br />

#include <br />

#include <br />

using namespace std;<br />

class Pet {<br />

string pname;<br />

public:<br />

Pet(const string& petName) : pname(petName) {}<br />

virtual string name() const { return pname; }<br />

virtual string speak() const { return ""; }<br />

};<br />

class Dog : public Pet {<br />

string name;<br />

public:<br />

Dog(const string& petName) : Pet(petName) {}<br />

// New virtual function in the Dog class:<br />

virtual string sit() const {<br />

return Pet::name() + " sits";<br />

}<br />

string speak() const { // Override<br />

return Pet::name() + " says ’Bark!’";<br />

}<br />

};<br />

int main() {<br />

Pet* p[] = {new Pet("g<strong>en</strong>eric"),new Dog("bob")};<br />

cout

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

Saved successfully!

Ooh no, something went wrong!