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