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

✐<br />

14.5. Funciones que no heredan automáticam<strong>en</strong>te<br />

Si mira con det<strong>en</strong>imi<strong>en</strong>to Game, observará que el constructor copia y la asignación<br />

ti<strong>en</strong><strong>en</strong> llamadas explicitas a constructor copia del objeto miembro y al operador<br />

de asignación. En la mayoría de ocasiones, deberá hacer esto porque sino, <strong>en</strong> vez<br />

del constructor copia, será llamado el constructor por defecto del objeto miembro,<br />

y <strong>en</strong> el caso del operador de asignación, ¡ninguna asignación se hará <strong>en</strong> los objetos<br />

miembros!<br />

Por último, fíjese <strong>en</strong> Checkers, dónde explícitam<strong>en</strong>te se escribe un constructor por<br />

defecto, constructor copia y los operadores de asignación. En el caso del constructor<br />

por defecto, el constructor por defecto de la clase base se llama automáticam<strong>en</strong>te,<br />

y esto es lo normalm<strong>en</strong>te que se desea hacer. Pero, aquí existe un punto importante,<br />

tan pronto que se decide escribir nuestro propio constructor copia y operador de<br />

asignación, el compilador asume que usted sabe lo que esta haci<strong>en</strong>do y no ejecutará<br />

automáticam<strong>en</strong>te las versiones de la clase base así como las funciones creadas<br />

automáticam<strong>en</strong>te. Si se quiere ejecutar las versiones de la clase base, debe llamarlas<br />

explícitam<strong>en</strong>te. En el constructor copia de Checkers, esta llamada aparece <strong>en</strong> la lista<br />

de inicialización del constructor:<br />

Checkers(const Checkers& c) : Game(c) {<br />

En el operador de asignación de Checkers, la clase base se llama <strong>en</strong> la primera<br />

línea del cuerpo de la función:<br />

Game::operator=(c);<br />

Estas llamadas deb<strong>en</strong> seguirse de forma canónica cuando usa cualquier clase derivada.<br />

14.5.1. Her<strong>en</strong>cia y métodos estáticos<br />

Las funciones miembro estáticas funcionan igual que las funciones miembros no<br />

estáticas:<br />

1. Son heredadas <strong>en</strong> la clase derivada.<br />

2. Si redefine un miembro estático, el resto de funciones sobrecargadas <strong>en</strong> la clase<br />

base son ocultas.<br />

3. Si cambia la signatura de una función <strong>en</strong> la clase base, todas las versiones con<br />

ese nombre de función <strong>en</strong> la clase base son ocultadas (esto es realm<strong>en</strong>te una<br />

variación del punto anterior).<br />

Sin embargo, las funciones miembro estáticas no pued<strong>en</strong> ser virtuales (este tema<br />

se cubrirá det<strong>en</strong>idam<strong>en</strong>te <strong>en</strong> el capítulo 15).<br />

14.5.2. Composición vs. her<strong>en</strong>cia<br />

La composición y la her<strong>en</strong>cia colocan subobjetos d<strong>en</strong>tro de la clase. Ambos usan<br />

la lista de inicialización del constructor para construir esos subobjetos. Pero se preguntará<br />

cuál es la difer<strong>en</strong>cia <strong>en</strong>tre los dos, y cuando escoger una y no la otra.<br />

La composición g<strong>en</strong>eralm<strong>en</strong>te se usa cuando se quier<strong>en</strong> las características de una<br />

clase exist<strong>en</strong>te d<strong>en</strong>tro se su clase, pero no <strong>en</strong> su interfaz. Esto es, aloja un objeto para<br />

417<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!