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 421 — #459<br />

✐<br />

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

m<strong>en</strong>te que lo conti<strong>en</strong>e. Esto es un tema muy importante que será explorado al final<br />

de este capitulo y el sigui<strong>en</strong>te.<br />

Her<strong>en</strong>cia privada<br />

Puede heredar utilizando una clase base de forma privada borrando public <strong>en</strong><br />

la lista de la clase base o explícitam<strong>en</strong>te utilizando private (definitivam<strong>en</strong>te la mejor<br />

política a tomar pues indica al usuario lo que desea hacer). Cuando se hereda de forma<br />

privada, esta "implem<strong>en</strong>tado <strong>en</strong> términos de", esto es, se esta creando una nueva<br />

clase que ti<strong>en</strong>e todos los datos y funcionalidad de la clase base, pero la funcionalidad<br />

esta oculta, solo una parte de capa de implem<strong>en</strong>tación. La clase derivada no ti<strong>en</strong>e acceso<br />

a la capa de funcionalidad y un objeto no puede ser creado como instancia de<br />

la clase base (como ocurrió <strong>en</strong> FName2.cpp).<br />

Se sorpr<strong>en</strong>derá del propósito de la her<strong>en</strong>cia privada, porque la alternativa, usar<br />

la composición para crear un objeto privado <strong>en</strong> la nueva clase parece más apropiada.<br />

La her<strong>en</strong>cia privada esta incluida para completar el l<strong>en</strong>guaje pero para reducir<br />

confusión, normalm<strong>en</strong>te se usará la composición <strong>en</strong> vez de la her<strong>en</strong>cia privada. Sin<br />

embargo, exist<strong>en</strong> ocasiones donde se desea el mismo interfaz como la clase base y<br />

anular tratami<strong>en</strong>to del objeto. La her<strong>en</strong>cia privada proporciona esta habilidad.<br />

14.5.2.2.1. Publicar los miembros heredados de forma privada Cuando se hereda<br />

de forma privada, todos los miembros públicos de la clase base llegan como<br />

privados. Si desea que cualquiera de ellos sea visible, solo use sus nombres (sin argum<strong>en</strong>tos<br />

o valores de retorno) junto con la palabra clave using <strong>en</strong> una sección pública<br />

de la clase derivada:<br />

//: C14:PrivateInheritance.cpp<br />

class Pet {<br />

public:<br />

char eat() const { return ’a’; }<br />

int speak() const { return 2; }<br />

float sleep() const { return 3.0; }<br />

float sleep(int) const { return 4.0; }<br />

};<br />

class Goldfish : Pet { // Private inheritance<br />

public:<br />

using Pet::eat; // Name publicizes member<br />

using Pet::sleep; // Both members exposed<br />

};<br />

int main() {<br />

Goldfish bob;<br />

bob.eat();<br />

bob.sleep();<br />

bob.sleep(1);<br />

//! bob.speak();// Error: private member function<br />

} ///:~<br />

Así, la her<strong>en</strong>cia privada es útil si desea esconder parte de la funcionalidad de la<br />

clase base.<br />

Fíjese que si expone el nombre de una función sobrecargada, expone todas las<br />

versiones sobrecargadas de la función <strong>en</strong> la clase base.<br />

421<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!