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 455 — #493<br />

✐<br />

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

equivocado habrá problemas.<br />

RTTI se describe posteriorm<strong>en</strong>te <strong>en</strong> este capítulo, y el Volum<strong>en</strong> 2 de este libro<br />

ti<strong>en</strong>e un capítulo dedicado al tema.<br />

15.8.1. FIXME: Object slicing<br />

Existe una gran difer<strong>en</strong>cia <strong>en</strong>tre pasar una dirección de un objeto a pasar el objeto<br />

por valor cuando se usa el polimorfismo. Todos los ejemplos que se han visto, y<br />

prácticam<strong>en</strong>te todos los ejemplos que se verán, se pasan por refer<strong>en</strong>cia y no por<br />

valor. Esto se debe a que todas las direcciones ti<strong>en</strong><strong>en</strong> el mismo tamaño 6 , por lo que<br />

pasar la dirección de un tipo derivado (que normalm<strong>en</strong>te será un objeto más grande)<br />

es lo mismo que pasar la dirección de un objeto del tipo base (que es normalm<strong>en</strong>te<br />

más pequeño). Como se explicó anteriorm<strong>en</strong>te, éste es el objetivo cuando se usa el<br />

polimorfismo - el código que maneja un tipo base puede, también manejar objetos<br />

derivados de forma transpar<strong>en</strong>te<br />

Si se hace un upcast de un objeto <strong>en</strong> vez de usar un puntero o una refer<strong>en</strong>cia, pasará<br />

algo que puede resultar sorpr<strong>en</strong>d<strong>en</strong>te: el objeto es "truncado", recortado, hasta<br />

que lo que quede sea un subobjeto que corresponda al tipo destino del molde. En<br />

el sigui<strong>en</strong>te ejemplo se puede ver que ocurre cuando un objeto es truncado (object<br />

slicing):<br />

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

#include <br />

#include <br />

using namespace std;<br />

class Pet {<br />

string pname;<br />

public:<br />

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

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

virtual string description() const {<br />

return "This is " + pname;<br />

}<br />

};<br />

class Dog : public Pet {<br />

string favoriteActivity;<br />

public:<br />

Dog(const string& name, const string& activity)<br />

: Pet(name), favoriteActivity(activity) {}<br />

string description() const {<br />

return Pet::name() + " likes to " +<br />

favoriteActivity;<br />

}<br />

};<br />

void describe(Pet p) { // Slices the object<br />

cout

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

Saved successfully!

Ooh no, something went wrong!