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