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 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